Skip to main content

edc_web_components/components/
create_federated_catalog_participant.rs

1use crate::services::get_dsp_endpoint;
2use edc_federated_catalog_client::models::FederatedCatalogParticipantCreateForm;
3use edc_federated_catalog_client::{FederatedCatalogClient, FederatedCatalogClientVersion};
4use edc_identity_hub_client::models::DidWeb;
5use patternfly_yew::prelude::*;
6use yew::platform::spawn_local;
7use yew::prelude::*;
8use yew_oauth2::hook::use_latest_access_token;
9
10#[derive(Clone, Debug, PartialEq, Properties)]
11pub struct CreateFederatedCatalogParticipantProps {
12  #[prop_or_default]
13  pub on_create: Callback<()>,
14}
15
16#[component]
17pub fn CreateFederatedCatalogParticipant(props: &CreateFederatedCatalogParticipantProps) -> Html {
18  let id = use_state(|| "".to_string());
19  let target_url = use_state(|| "".to_string());
20
21  let onchange_id = use_callback(
22    (id.setter(), target_url.setter()),
23    |did: String, (id_setter, target_url_setter)| {
24      let target_setter = target_url_setter.clone();
25
26      if let Some(did_web) = DidWeb::new(&did) {
27        spawn_local(async move {
28          if let Some(dsp_endpoint) = get_dsp_endpoint(&did_web).await {
29            target_setter.set(dsp_endpoint);
30          }
31        });
32      }
33
34      id_setter.set(did);
35    },
36  );
37
38  let onchange_target_url = use_callback(target_url.setter(), |value, target_url_setter| {
39    target_url_setter.set(value);
40  });
41
42  let disabled = false;
43
44  let latest_access_token_context = use_latest_access_token().unwrap();
45
46  let onsubmit = use_callback(
47    (
48      id.clone(),
49      target_url.clone(),
50      props.on_create.clone(),
51      latest_access_token_context.clone(),
52    ),
53    |event: SubmitEvent, (id, target_url, on_create, latest_access_token_context)| {
54      event.prevent_default();
55      let on_create = on_create.clone();
56      let latest_access_token_context = latest_access_token_context.clone();
57
58      let id = (**id).clone();
59      let target_url = (**target_url).clone();
60
61      spawn_local(async move {
62        let server_url = web_sys::window().unwrap().location().origin().unwrap();
63        let federated_catalog_management_client = FederatedCatalogClient::new(
64          reqwest::Client::new(),
65          format!("{server_url}/federated-catalog-management"),
66          latest_access_token_context.access_token(),
67          FederatedCatalogClientVersion::V4,
68        );
69
70        match federated_catalog_management_client
71          .create_participant(&FederatedCatalogParticipantCreateForm {
72            id: id.clone(),
73            name: "".to_string(),
74            target_url: target_url.clone(),
75          })
76          .await
77        {
78          Ok(()) => {
79            on_create.emit(());
80          }
81          Err(message) => {
82            log::error!("{message}");
83          }
84        }
85      })
86    },
87  );
88
89  html!(
90    <Form {onsubmit}>
91      <FormGroup label="Counter Party DID" required=true>
92        <TextInput required=true value={(*id).to_string()} onchange={onchange_id} />
93      </FormGroup>
94      <FormGroup label="Counter Party Address" required=true>
95        <TextInput
96          required=true
97          value={(*target_url).to_string()}
98          onchange={onchange_target_url}
99          r#type={TextInputType::Url}
100        />
101      </FormGroup>
102      <ActionGroup>
103        <Button
104          variant={ButtonVariant::Primary}
105          label="Submit"
106          r#type={ButtonType::Submit}
107          {disabled}
108        />
109        <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
110      </ActionGroup>
111    </Form>
112  )
113}