edc-web-components 0.5.12

A Rust Web Components with patternfly-yew client for EDC
Documentation
use crate::contexts::use_edc_connector_context;
use crate::models::AssetItem;
use edc_connector_client::EdcConnectorApiVersion;
use patternfly_yew::prelude::*;
use yew::prelude::*;
use yew::suspense::use_future_with;

#[derive(Clone, Debug, PartialEq, Properties)]
pub struct AssetReferenceProps {
  pub asset_id: String,
  pub on_click: Callback<()>,
}

#[component]
pub fn AssetReference(props: &AssetReferenceProps) -> Html {
  html! {
    <Suspense fallback={html! {<Bullseye><Spinner size={SpinnerSize::Sm} /></Bullseye>}}>
      <AssetReferenceInner asset_id={props.asset_id.clone()} on_click={props.on_click.clone()} />
    </Suspense>
  }
}

#[component]
pub fn AssetReferenceInner(props: &AssetReferenceProps) -> HtmlResult {
  let edc_connector_context = use_edc_connector_context();

  let asset = use_future_with(
    (props.asset_id.clone(), edc_connector_context.clone()),
    async move |parameters| {
      let (asset_id, edc_connector_context) = (*parameters).clone();

      if let Some(edc_connector_client) = edc_connector_context.get_client() {
        edc_connector_client
          .assets(EdcConnectorApiVersion::V4)
          .get(&asset_id)
          .await
          .ok()
          .map(AssetItem::from)
      } else {
        None
      }
    },
  )?;

  let asset = (*asset).clone();

  let label = if let Some(asset) = asset {
    asset.name
  } else {
    props.asset_id.clone()
  };

  Ok(html!(
    <Button variant={ButtonVariant::InlineLink} onclick={props.on_click.reform(|_| ())}>
      { label }
    </Button>
  ))
}