edc-web-components 0.5.11

A Rust Web Components with patternfly-yew client for EDC
Documentation
use crate::contexts::use_edc_identity_hub_context;
use patternfly_yew::prelude::*;
use yew::prelude::*;
use yew::suspense::use_future_with;

#[derive(Clone, Debug, PartialEq, Properties)]
pub struct ShowVerifiableCredentialPageProps {
  pub verifiable_credential_id: String,
}

#[component]
pub fn ShowVerifiableCredentialPage(props: &ShowVerifiableCredentialPageProps) -> Html {
  html!(
    <>
      <Title level={Level::H2} size={Size::XXXLarge}>{ "Verifiable Credential" }</Title>
      <Suspense fallback="Loading ...">
        <ShowVerifiableCredentialPageInner
          verifiable_credential_id={props.verifiable_credential_id.clone()}
        />
      </Suspense>
    </>
  )
}

#[component]
pub fn ShowVerifiableCredentialPageInner(props: &ShowVerifiableCredentialPageProps) -> HtmlResult {
  let edc_identity_hub_context = use_edc_identity_hub_context();

  let verifiable_credential = use_future_with(
    (
      props.verifiable_credential_id.clone(),
      edc_identity_hub_context.clone(),
    ),
    |properties| async move {
      let (verifiable_credential_id, edc_identity_hub_context) = (*properties).clone();
      edc_identity_hub_context
        .get_client()
        .get_credential(
          edc_identity_hub_context.participant_id(),
          &verifiable_credential_id,
        )
        .await
        .ok()
    },
  )?;

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

  if let Some(verifiable_credential) = verifiable_credential {
    let types = verifiable_credential
      .verifiable_credential
      .credential
      .r#type
      .iter()
      .map(|type_name| {
        html_nested!(
          <FlexItem>
            <Label label={type_name.to_string()} color={Color::Blue} />
          </FlexItem>
        )
      });

    let credential_subjects = verifiable_credential
      .verifiable_credential
      .credential
      .credential_subject
      .iter()
      .map(|credential_subject| {
        html!(
          <CodeBlock>
            <CodeBlockCode>
              { serde_json::to_string_pretty(credential_subject).unwrap_or_default() }
            </CodeBlockCode>
          </CodeBlock>
        )
      });

    Ok(html!(
      <DescriptionList mode={[DescriptionListMode::Horizontal]}>
        <DescriptionGroup term="Id">{ verifiable_credential.id }</DescriptionGroup>
        <DescriptionGroup term="Issuer ID">{ verifiable_credential.issuer_id }</DescriptionGroup>
        <DescriptionGroup term="Holder ID">{ verifiable_credential.holder_id }</DescriptionGroup>
        <DescriptionGroup term="Created at">
          { chrono::DateTime::from_timestamp_millis(verifiable_credential.created_at.timestamp()).unwrap().format("%Y-%m-%d %H:%M:%S").to_string() }
        </DescriptionGroup>
        <DescriptionGroup term="Insurance Date">
          { verifiable_credential.verifiable_credential.credential.issuance_date.format("%Y-%m-%d %H:%M:%S").to_string() }
        </DescriptionGroup>
        <DescriptionGroup term="Expiration Date">
          { verifiable_credential.verifiable_credential.credential.expiration_date.format("%Y-%m-%d %H:%M:%S").to_string() }
        </DescriptionGroup>
        <DescriptionGroup term="Name">
          { verifiable_credential.verifiable_credential.credential.name }
        </DescriptionGroup>
        <DescriptionGroup term="Description">
          { verifiable_credential.verifiable_credential.credential.description.unwrap_or_default() }
        </DescriptionGroup>
        <DescriptionGroup term="Types">
          <Flex>{ for types }</Flex>
        </DescriptionGroup>
        <DescriptionGroup term="Credential Subjects">{ for credential_subjects }</DescriptionGroup>
      </DescriptionList>
    ))
  } else {
    Ok(html!(
      format!(
      "Verifiable Credential with id {} not found.",
      props.verifiable_credential_id
    )
    ))
  }
}