edc-web-ui 0.1.0

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

#[derive(Debug, PartialEq, Clone)]
pub enum EdcConnectorAction {}

#[derive(Clone, PartialEq)]
pub struct EdcConnectorState {
  management_url: String,
  api_key: Option<String>,
}

impl EdcConnectorState {
  pub fn get_client(&self) -> Option<EdcConnectorClient> {
    let builder = EdcConnectorClient::builder().management_url(self.management_url.clone());

    let builder = if let Some(api_key) = self.api_key.as_ref() {
      builder.with_auth(Auth::ApiToken(api_key.clone()))
    } else {
      builder
    };

    builder.build().ok()
  }
}

impl Reducible for EdcConnectorState {
  type Action = EdcConnectorAction;

  fn reduce(self: Rc<Self>, _action: Self::Action) -> Rc<Self> {
    let new_self = self.deref().clone();

    new_self.into()
  }
}

#[derive(Properties, PartialEq)]
pub struct Props {
  #[prop_or_default]
  pub children: Html,
  pub management_url: String,
  pub api_key: Option<String>,
}

#[function_component]
pub fn EdcConnectorContextProvider(props: &Props) -> Html {
  let edc_connector_context = use_reducer(move || EdcConnectorState {
    management_url: props.management_url.clone(),
    api_key: props.api_key.clone(),
  });

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

pub type EdcConnectorContext = UseReducerHandle<EdcConnectorState>;

#[hook]
pub fn use_edc_connector_context() -> EdcConnectorContext {
  use_context::<EdcConnectorContext>().expect("no EDC Connector context found")
}