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