edc-web-components 0.8.1

A Rust Web Components with patternfly-yew client for EDC
Documentation
use edc_connector_client::{Auth, EdcConnectorClient};
use yew::prelude::*;
use yew_oauth2::context::LatestAccessToken;
use yew_oauth2::prelude::use_latest_access_token;

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

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
    };

    let builder = if let Some(access_token) = self
      .latest_access_token_context
      .as_ref()
      .and_then(|latest_access_token_context| latest_access_token_context.access_token())
    {
      builder.with_auth(Auth::BearerToken(access_token))
    } else {
      builder
    };

    builder.build().ok()
  }
}

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

#[component]
pub fn EdcConnectorContextProvider(props: &EdcConnectorContextProviderProps) -> Html {
  let latest_access_token_context = use_latest_access_token();

  let edc_connector_context = {
    let latest_access_token_context = latest_access_token_context.clone();

    use_state(move || EdcConnectorState {
      management_url: props.management_url.clone(),
      api_key: props.api_key.clone(),
      latest_access_token_context,
    })
  };

  use_effect_with(
    (
      props.management_url.clone(),
      props.api_key.clone(),
      edc_connector_context.setter(),
      latest_access_token_context.clone(),
    ),
    |(management_url, api_key, edc_connector_context_setter, latest_access_token_context)| {
      edc_connector_context_setter.set(EdcConnectorState {
        management_url: management_url.clone(),
        api_key: api_key.clone(),
        latest_access_token_context: latest_access_token_context.clone(),
      });
    },
  );

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

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