edc_web_components/components/
create_federated_catalog_participant.rs1use 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}