edc_web_components/pages/
federated_catalog_page.rs1use crate::components::{ListFederatedCatalogOffers, SelectedFederatedCatalogOffer};
2use edc_federated_catalog_client::{FederatedCatalogClient, FederatedCatalogClientVersion};
3use patternfly_yew::prelude::*;
4use yew::prelude::*;
5use yew::suspense::use_future_with;
6use yew_oauth2::hook::use_latest_access_token;
7
8#[derive(Clone, Debug, PartialEq, Properties)]
9pub struct CatalogPageProps {
10 pub onselectedoffer: Callback<SelectedFederatedCatalogOffer>,
11}
12
13#[component]
14pub fn CatalogPage(props: &CatalogPageProps) -> Html {
15 let refresh = use_state(|| 0usize);
16
17 html!(
18 <Stack gutter=true>
19 <StackItem>
20 <Split gutter=true>
21 <SplitItem fill=true>
22 <Title level={Level::H3} size={Size::XXLarge}>{ "Catalog" }</Title>
23 </SplitItem>
24 </Split>
25 </StackItem>
26 <StackItem>
27 <Suspense>
28 <CatalogPageInner
29 force_refresh={*refresh}
30 onselectedoffer={props.onselectedoffer.clone()}
31 />
32 </Suspense>
33 </StackItem>
34 </Stack>
35 )
36}
37
38#[derive(Clone, Debug, PartialEq, Properties)]
39pub struct CatalogPageInnerProps {
40 pub force_refresh: usize,
41 pub onselectedoffer: Callback<SelectedFederatedCatalogOffer>,
42}
43
44#[component]
45pub fn CatalogPageInner(props: &CatalogPageInnerProps) -> HtmlResult {
46 let latest_access_token_context = use_latest_access_token().unwrap();
47
48 let federated_catalog_offers = use_future_with(
49 (latest_access_token_context.clone(), props.force_refresh),
50 |parameters| async move {
51 let (latest_access_token_context, _) = (*parameters).clone();
52
53 let server_url = web_sys::window().unwrap().location().origin().unwrap();
54 let federated_catalog_client = FederatedCatalogClient::new(
55 reqwest::Client::new(),
56 format!("{server_url}/federated-catalog"),
57 latest_access_token_context.access_token(),
58 FederatedCatalogClientVersion::V4,
59 );
60
61 federated_catalog_client
62 .list_offers()
63 .await
64 .unwrap_or_default()
65 },
66 )?;
67
68 let federated_catalog_offers = (*federated_catalog_offers).clone();
69
70 Ok(html!(
71 <ListFederatedCatalogOffers
72 {federated_catalog_offers}
73 onselectedoffer={props.onselectedoffer.clone()}
74 />
75 ))
76}