Skip to main content

edc_web_components/pages/
verifiable_credential_page.rs

1use crate::components::ListVerifiableCredentials;
2use crate::contexts::use_edc_identity_hub_context;
3use crate::models::VerifiableCredential;
4use patternfly_yew::prelude::*;
5use yew::platform::spawn_local;
6use yew::prelude::*;
7use yew::suspense::use_future_with;
8
9#[derive(Clone, Debug, PartialEq, Properties)]
10pub struct VerifiableCredentialPageProps {
11  pub on_new_verifiable_credential: Callback<()>,
12  pub onshow: Callback<String>,
13}
14
15#[component]
16pub fn VerifiableCredentialPage(props: &VerifiableCredentialPageProps) -> Html {
17  let refresh = use_state(|| 0usize);
18
19  let edc_identity_hub_context = use_edc_identity_hub_context();
20
21  let ondelete = use_callback(
22    (refresh.clone(), edc_identity_hub_context),
23    |verifiable_credential_id: String, (refresh, edc_identity_hub_context)| {
24      let refresh = refresh.clone();
25      let verifiable_credential_id = verifiable_credential_id.clone();
26      let edc_identity_hub_context = edc_identity_hub_context.clone();
27
28      spawn_local(async move {
29        let identity_hub_client = edc_identity_hub_context.get_client();
30
31        identity_hub_client
32          .delete_credential(
33            edc_identity_hub_context.participant_id(),
34            &verifiable_credential_id,
35          )
36          .await
37          .unwrap_or_default();
38
39        log::warn!(
40          "Deleted Verifiable Credential {} - {}",
41          verifiable_credential_id,
42          *refresh + 1
43        );
44        refresh.set(*refresh + 1);
45      });
46    },
47  );
48
49  let onclick = use_callback(
50    props.on_new_verifiable_credential.clone(),
51    |_, on_new_verifiable_credential| {
52      on_new_verifiable_credential.emit(());
53    },
54  );
55
56  html!(
57    <Stack gutter=true>
58      <StackItem>
59        <Split gutter=true>
60          <SplitItem fill=true>
61            <Title level={Level::H3} size={Size::XXLarge}>{ "Verifiable Credentials" }</Title>
62          </SplitItem>
63          <SplitItem>
64            <Button icon={Icon::Plus} {onclick} variant={ButtonVariant::Primary}>
65              { "Request a Verifiable Credential" }
66            </Button>
67          </SplitItem>
68        </Split>
69      </StackItem>
70      <StackItem>
71        <Suspense>
72          <VerifiableCredentialPageInner
73            {ondelete}
74            onshow={props.onshow.clone()}
75            force_refresh={*refresh}
76          />
77        </Suspense>
78      </StackItem>
79    </Stack>
80  )
81}
82
83#[derive(Clone, Debug, PartialEq, Properties)]
84pub struct VerifiableCredentialPageInnerProps {
85  pub ondelete: Callback<String>,
86  pub onshow: Callback<String>,
87  pub force_refresh: usize,
88}
89
90#[component]
91pub fn VerifiableCredentialPageInner(props: &VerifiableCredentialPageInnerProps) -> HtmlResult {
92  let edc_identity_hub_context = use_edc_identity_hub_context();
93
94  let verifiable_credential_items = use_future_with(
95    (edc_identity_hub_context, props.force_refresh),
96    |parameters| async move {
97      let (edc_identity_hub_context, _) = (*parameters).clone();
98      let identity_hub_client = edc_identity_hub_context.get_client();
99
100      identity_hub_client
101        .get_credentials(edc_identity_hub_context.participant_id())
102        .await
103        .unwrap_or_default()
104        .into_iter()
105        .map(VerifiableCredential::from)
106        .collect::<Vec<_>>()
107    },
108  )?;
109
110  let verifiable_credential_items = (*verifiable_credential_items).clone();
111
112  Ok(html!(
113    <ListVerifiableCredentials
114      verifiable_credential_items={verifiable_credential_items}
115      ondelete={props.ondelete.clone()}
116      onshow={props.onshow.clone()}
117    />
118  ))
119}