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