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: 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.latest_access_token_context.access_token() {
28      builder.with_auth(Auth::BearerToken(access_token))
29    } else {
30      builder
31    };
32
33    builder.build().ok()
34  }
35}
36
37impl Reducible for EdcConnectorState {
38  type Action = EdcConnectorAction;
39
40  fn reduce(self: Rc<Self>, _action: Self::Action) -> Rc<Self> {
41    let new_self = self.deref().clone();
42
43    new_self.into()
44  }
45}
46
47#[derive(Properties, PartialEq)]
48pub struct EdcConnectorContextProviderProps {
49  #[prop_or_default]
50  pub children: Html,
51  pub management_url: String,
52  pub api_key: Option<String>,
53}
54
55#[component]
56pub fn EdcConnectorContextProvider(props: &EdcConnectorContextProviderProps) -> Html {
57  let latest_access_token_context = use_latest_access_token().unwrap();
58
59  let edc_connector_context = use_reducer(move || EdcConnectorState {
60    management_url: props.management_url.clone(),
61    api_key: props.api_key.clone(),
62    latest_access_token_context,
63  });
64
65  html! {
66    <ContextProvider<EdcConnectorContext> context={edc_connector_context}>
67      { props.children.clone() }
68    </ContextProvider<EdcConnectorContext>>
69  }
70}
71
72pub type EdcConnectorContext = UseReducerHandle<EdcConnectorState>;
73
74#[hook]
75pub fn use_edc_connector_context() -> EdcConnectorContext {
76  use_context::<EdcConnectorContext>().expect("no EDC Connector context found")
77}