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