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