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