edc_web_components/contexts/
edc_connector_context.rs1use 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}