Skip to main content

edc_web_components/pages/
federated_catalog_page.rs

1use 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}