Skip to main content

edc_web_components/contexts/
edc_connector_context.rs

1use 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}