Skip to main content

edc_web_components/components/
asset_card.rs

1use crate::components::DatasetCard;
2use crate::contexts::use_edc_connector_context;
3use crate::models::{AssetItem, DataspaceDataset};
4use edc_connector_client::EdcConnectorApiVersion;
5use patternfly_yew::prelude::*;
6use yew::prelude::*;
7use yew::suspense::use_future_with;
8
9#[derive(Clone, PartialEq, Properties)]
10pub struct AssetCardProps {
11  pub asset_id: String,
12}
13
14#[component]
15pub fn AssetCard(props: &AssetCardProps) -> Html {
16  html!(
17    <Suspense fallback={html!(<Bullseye><Spinner /></Bullseye>)}>
18      <AssetCardInner asset_id={props.asset_id.clone()} />
19    </Suspense>
20  )
21}
22
23#[component]
24pub fn AssetCardInner(props: &AssetCardProps) -> HtmlResult {
25  let edc_connector_context = use_edc_connector_context();
26
27  let results = use_future_with(
28    (edc_connector_context, props.asset_id.clone()),
29    |parameters| async move {
30      let (edc_connector_context, asset_id) = (*parameters).clone();
31
32      if let Some(client) = edc_connector_context.get_client() {
33        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  if let Some(asset) = (*results).clone() {
46    let dataset = DataspaceDataset::from(asset);
47
48    Ok(html!(<DatasetCard {dataset} />))
49  } else {
50    Ok(html!(<Alert title="Asset not found" r#type={AlertType::Danger} />))
51  }
52}