Skip to main content

edc_web_components/components/
asset_reference.rs

1use crate::contexts::use_edc_connector_context;
2use crate::models::AssetItem;
3use edc_connector_client::EdcConnectorApiVersion;
4use patternfly_yew::prelude::*;
5use yew::prelude::*;
6use yew::suspense::use_future_with;
7
8#[derive(Clone, Debug, PartialEq, Properties)]
9pub struct AssetReferenceProps {
10  pub asset_id: String,
11  pub on_click: Callback<()>,
12}
13
14#[component]
15pub fn AssetReference(props: &AssetReferenceProps) -> Html {
16  html! {
17    <Suspense fallback={html! {<Bullseye><Spinner size={SpinnerSize::Sm} /></Bullseye>}}>
18      <AssetReferenceInner asset_id={props.asset_id.clone()} on_click={props.on_click.clone()} />
19    </Suspense>
20  }
21}
22
23#[component]
24pub fn AssetReferenceInner(props: &AssetReferenceProps) -> HtmlResult {
25  let edc_connector_context = use_edc_connector_context();
26
27  let asset = use_future_with(
28    (props.asset_id.clone(), edc_connector_context.clone()),
29    async move |parameters| {
30      let (asset_id, edc_connector_context) = (*parameters).clone();
31
32      if let Some(edc_connector_client) = edc_connector_context.get_client() {
33        edc_connector_client
34          .assets(EdcConnectorApiVersion::V4)
35          .get(&asset_id)
36          .await
37          .ok()
38          .map(AssetItem::from)
39      } else {
40        None
41      }
42    },
43  )?;
44
45  let asset = (*asset).clone();
46
47  let label = if let Some(asset) = asset {
48    asset.name
49  } else {
50    props.asset_id.clone()
51  };
52
53  Ok(html!(
54    <Button variant={ButtonVariant::InlineLink} onclick={props.on_click.reform(|_| ())}>
55      { label }
56    </Button>
57  ))
58}