Skip to main content

edc_web_components/components/
policy_reference.rs

1use crate::contexts::{RedirectionAction, use_edc_connector_context, use_redirection_context};
2use crate::models::PolicyDefinitionItem;
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 PolicyReferenceProps {
10  pub policy_id: String,
11}
12
13#[component]
14pub fn PolicyReference(props: &PolicyReferenceProps) -> Html {
15  html! {
16    <Suspense fallback={html! {<Bullseye><Spinner size={SpinnerSize::Sm} /></Bullseye>}}>
17      <PolicyReferenceInner policy_id={props.policy_id.clone()} />
18    </Suspense>
19  }
20}
21
22#[component]
23pub fn PolicyReferenceInner(props: &PolicyReferenceProps) -> HtmlResult {
24  let edc_connector_context = use_edc_connector_context();
25  let redirection_context = use_redirection_context();
26
27  let policy = use_future_with(
28    (props.policy_id.clone(), edc_connector_context.clone()),
29    async move |parameters| {
30      let (policy_id, edc_connector_context) = (*parameters).clone();
31
32      if let Some(edc_connector_client) = edc_connector_context.get_client() {
33        edc_connector_client
34          .policies(EdcConnectorApiVersion::V4)
35          .get(&policy_id)
36          .await
37          .ok()
38          .map(PolicyDefinitionItem::from)
39      } else {
40        None
41      }
42    },
43  )?;
44
45  let policy = (*policy).clone();
46
47  let label = if let Some(policy) = policy {
48    policy.name
49  } else {
50    "Policy".to_string()
51  };
52
53  let onclick = redirection_context
54    .map(|redirection_context| {
55      let policy_id = props.policy_id.clone();
56
57      redirection_context
58        .redirect_to()
59        .reform(move |_| RedirectionAction::Policy(policy_id.clone()))
60    })
61    .unwrap_or_default();
62
63  Ok(html!(
64    <Button variant={ButtonVariant::InlineLink} {onclick}>
65      <Flex>
66        <FlexItem modifiers={[FlexModifier::Align(Alignment::Center).all()]}>
67          <yew_icons::Icon data={yew_icons::IconData::LUCIDE_SHIELD} />
68        </FlexItem>
69        <FlexItem modifiers={[FlexModifier::Align(Alignment::Center).all()]}>{ label }</FlexItem>
70      </Flex>
71    </Button>
72  ))
73}