edc_web_components/pages/
verifiable_credential_page.rs1use 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}