Skip to main content

edc_web_components/contexts/
edc_connector_context.rs

1use edc_connector_client::{Auth, EdcConnectorClient};
2use std::{ops::Deref, rc::Rc};
3use yew::prelude::*;
4use yew_oauth2::context::LatestAccessToken;
5use yew_oauth2::prelude::use_latest_access_token;
6
7#[derive(Debug, PartialEq, Clone)]
8pub enum EdcConnectorAction {}
9
10#[derive(Clone, PartialEq)]
11pub struct EdcConnectorState {
12  management_url: String,
13  api_key: Option<String>,
14  latest_access_token_context: Option<LatestAccessToken>,
15}
16
17impl EdcConnectorState {
18  pub fn get_client(&self) -> Option<EdcConnectorClient> {
19    let builder = EdcConnectorClient::builder().management_url(self.management_url.clone());
20
21    let builder = if let Some(api_key) = self.api_key.as_ref() {
22      builder.with_auth(Auth::ApiToken(api_key.clone()))
23    } else {
24      builder
25    };
26
27    let builder = if let Some(access_token) = self
28      .latest_access_token_context
29      .as_ref()
30      .and_then(|latest_access_token_context| latest_access_token_context.access_token())
31    {
32      builder.with_auth(Auth::BearerToken(access_token))
33    } else {
34      builder
35    };
36
37    builder.build().ok()
38  }
39}
40
41impl Reducible for EdcConnectorState {
42  type Action = EdcConnectorAction;
43
44  fn reduce(self: Rc<Self>, _action: Self::Action) -> Rc<Self> {
45    let new_self = self.deref().clone();
46
47    new_self.into()
48  }
49}
50
51#[derive(Properties, PartialEq)]
52pub struct EdcConnectorContextProviderProps {
53  #[prop_or_default]
54  pub children: Html,
55  pub management_url: String,
56  pub api_key: Option<String>,
57}
58
59#[component]
60pub fn EdcConnectorContextProvider(props: &EdcConnectorContextProviderProps) -> Html {
61  let latest_access_token_context = use_latest_access_token();
62
63  let edc_connector_context = use_reducer(move || EdcConnectorState {
64    management_url: props.management_url.clone(),
65    api_key: props.api_key.clone(),
66    latest_access_token_context,
67  });
68
69  html! {
70    <ContextProvider<EdcConnectorContext> context={edc_connector_context}>
71      { props.children.clone() }
72    </ContextProvider<EdcConnectorContext>>
73  }
74}
75
76pub type EdcConnectorContext = UseReducerHandle<EdcConnectorState>;
77
78#[hook]
79pub fn use_edc_connector_context() -> EdcConnectorContext {
80  use_context::<EdcConnectorContext>().expect("no EDC Connector context found")
81}