Skip to main content

edc_web_components/components/
create_federated_catalog_participant.rs

1use crate::services::DidResolver;
2use edc_federated_catalog_client::models::FederatedCatalogParticipantCreateForm;
3use edc_federated_catalog_client::{FederatedCatalogClient, FederatedCatalogClientVersion};
4use edc_identity_hub_client::models::{DidWeb, IdentityServiceType};
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 name = use_state(|| "".to_string());
20  let target_url = use_state(|| "".to_string());
21
22  let onchange_id = use_callback(
23    (id.setter(), target_url.setter()),
24    |did: String, (id_setter, target_url_setter)| {
25      let target_setter = target_url_setter.clone();
26
27      if let Some(did_web) = DidWeb::new(&did) {
28        spawn_local(async move {
29          if let Ok(identity) = DidResolver::new(reqwest::Client::new())
30            .resolve(did_web)
31            .await
32            && let Some(identity_service) = identity
33              .get_identity_services(IdentityServiceType::DataService)
34              .first()
35            && let Some(dataspace_service_client) = identity_service.get_dataspace_service_client()
36            && let Some(dsp_endpoint) = dataspace_service_client.get_first_service_endpoint().await
37          {
38            target_setter.set(dsp_endpoint);
39          }
40        });
41      }
42
43      id_setter.set(did);
44    },
45  );
46
47  let onchange_name = use_callback(name.setter(), |value, name_setter| {
48    name_setter.set(value);
49  });
50
51  let onchange_target_url = use_callback(target_url.setter(), |value, target_url_setter| {
52    target_url_setter.set(value);
53  });
54
55  let disabled = false;
56
57  let latest_access_token_context = use_latest_access_token().unwrap();
58
59  let onsubmit = use_callback(
60    (
61      id.clone(),
62      name.clone(),
63      target_url.clone(),
64      props.on_create.clone(),
65      latest_access_token_context.clone(),
66    ),
67    |event: SubmitEvent, (id, name, target_url, on_create, latest_access_token_context)| {
68      event.prevent_default();
69      let on_create = on_create.clone();
70      let latest_access_token_context = latest_access_token_context.clone();
71
72      let id = (**id).clone();
73      let name = (**name).clone();
74      let target_url = (**target_url).clone();
75
76      spawn_local(async move {
77        let server_url = web_sys::window().unwrap().location().origin().unwrap();
78        let federated_catalog_management_client = FederatedCatalogClient::new(
79          reqwest::Client::new(),
80          format!("{server_url}/federated-catalog-management"),
81          latest_access_token_context.access_token(),
82          FederatedCatalogClientVersion::V4,
83        );
84
85        match federated_catalog_management_client
86          .create_participant(&FederatedCatalogParticipantCreateForm {
87            id: id.clone(),
88            name: name.clone(),
89            target_url: target_url.clone(),
90          })
91          .await
92        {
93          Ok(()) => {
94            on_create.emit(());
95          }
96          Err(message) => {
97            log::error!("{message}");
98          }
99        }
100      })
101    },
102  );
103
104  html!(
105    <Form {onsubmit}>
106      <FormGroup label="Counter Party DID" required=true>
107        <TextInput required=true value={(*id).to_string()} onchange={onchange_id} />
108      </FormGroup>
109      <FormGroup label="Counter Party Name" required=true>
110        <TextInput required=true value={(*name).to_string()} onchange={onchange_name} />
111      </FormGroup>
112      <FormGroup label="Counter Party Address" required=true>
113        <TextInput
114          required=true
115          value={(*target_url).to_string()}
116          onchange={onchange_target_url}
117          r#type={TextInputType::Url}
118        />
119      </FormGroup>
120      <ActionGroup>
121        <Button
122          variant={ButtonVariant::Primary}
123          label="Submit"
124          r#type={ButtonType::Submit}
125          {disabled}
126        />
127        <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
128      </ActionGroup>
129    </Form>
130  )
131}