edc-web-components 0.8.1

A Rust Web Components with patternfly-yew client for EDC
Documentation
use std::{ops::Deref, rc::Rc};
use yew::prelude::*;

#[derive(Debug, PartialEq, Clone)]
pub enum RedirectionAction {
  Assets,
  Asset(String),
  Policies,
  Policy(String),
  ContractDefinitions,
  ContractNegotiations,
  ContractNegotiation(String),
  ContractAgreements,
  ContractAgreement(String),
  TransferProcesses,
  TransferProcess(String),
  VerifiableCredentials,
  VerifiableCredential(String),
}

#[derive(Clone, PartialEq)]
pub struct RedirectionState {
  redirect_to: Callback<RedirectionAction>,
}

impl RedirectionState {
  pub fn redirect_to(&self) -> Callback<RedirectionAction> {
    self.redirect_to.clone()
  }
}

impl Reducible for RedirectionState {
  type Action = RedirectionAction;

  fn reduce(self: Rc<Self>, action: Self::Action) -> Rc<Self> {
    let new_self = self.deref().clone();
    new_self.redirect_to.emit(action);
    new_self.into()
  }
}

#[derive(Properties, PartialEq)]
pub struct RedirectionContextProviderProps {
  #[prop_or_default]
  pub children: Html,
  pub redirect_to: Callback<RedirectionAction>,
}

#[component]
pub fn RedirectionContextProvider(props: &RedirectionContextProviderProps) -> Html {
  let redirection_context = use_reducer(move || RedirectionState {
    redirect_to: props.redirect_to.clone(),
  });

  html! {
    <ContextProvider<RedirectionContext> context={redirection_context}>
      { props.children.clone() }
    </ContextProvider<RedirectionContext>>
  }
}

pub type RedirectionContext = UseReducerHandle<RedirectionState>;

#[hook]
pub fn use_redirection_context() -> Option<RedirectionContext> {
  use_context::<RedirectionContext>()
}