edc_web_components/components/
asset_reference.rs1use 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}