Skip to main content

edc_web_components/components/
create_federated_catalog_participant.rs

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