edc_web_ui/components/
create_contract_negotiation.rs1use crate::components::PolicySelector;
2use crate::contexts::use_edc_connector_context;
3use crate::models::PolicyDefinitionItem;
4use edc_connector_client::types::contract_negotiation::ContractRequest;
5use patternfly_yew::prelude::*;
6use yew::platform::spawn_local;
7use yew::prelude::*;
8
9#[derive(Clone, Debug, PartialEq, Properties)]
10pub struct CreateContractNegotiationProps {
11 #[prop_or_default]
12 pub on_create: Callback<()>,
13}
14
15#[component]
16pub fn CreateContractNegotiation(props: &CreateContractNegotiationProps) -> Html {
17 let edc_connector_context = use_edc_connector_context();
18
19 let counter_party_address = use_state(String::new);
20 let counter_party_id = use_state(String::new);
21 let policy_definition_item = use_state(|| Option::<PolicyDefinitionItem>::None);
22
23 let onsubmit = use_callback(
24 (
25 edc_connector_context.clone(),
26 counter_party_address.clone(),
27 counter_party_id.clone(),
28 policy_definition_item.clone(),
29 props.on_create.clone(),
30 ),
31 |event: SubmitEvent,
32 (
33 edc_connector_context,
34 counter_party_address,
35 counter_party_id,
36 policy_definition_item,
37 oncreate,
38 )| {
39 event.prevent_default();
40
41 let edc_connector_context = edc_connector_context.clone();
42 let counter_party_address = (**counter_party_address).clone();
43 let counter_party_id = (**counter_party_id).clone();
44 let policy_definition_item = (**policy_definition_item).clone();
45 let oncreate = oncreate.clone();
46
47 spawn_local(async move {
48 if let Some(policy_definition_item) = policy_definition_item
49 && let Some(client) = edc_connector_context.get_client()
50 && let Ok(policy_definition) = client.policies().get(&policy_definition_item.id).await
51 {
52 let contract_request = ContractRequest::builder()
53 .counter_party_address(counter_party_address)
54 .counter_party_id(counter_party_id)
55 .policy(policy_definition.policy().clone())
56 .build();
57
58 let _ = client
59 .contract_negotiations()
60 .initiate(&contract_request)
61 .await;
62
63 oncreate.emit(());
64 }
65 })
66 },
67 );
68
69 let onchange_counter_party_address = use_callback(
70 counter_party_address.setter(),
71 move |counter_party_address, counter_party_address_setter| {
72 counter_party_address_setter.set(counter_party_address);
73 },
74 );
75
76 let onchange_counter_party_id = use_callback(
77 counter_party_id.setter(),
78 move |counter_party_id, counter_party_id_setter| {
79 counter_party_id_setter.set(counter_party_id);
80 },
81 );
82
83 let onselect_policy = use_callback(
84 policy_definition_item.setter(),
85 move |policy_definition_item, policy_definition_item_setter| {
86 policy_definition_item_setter.set(Some(policy_definition_item));
87 },
88 );
89
90 let disabled = (*policy_definition_item).is_none();
91
92 html!(
93 <Form {onsubmit}>
94 <FormGroup label="Counter Party Address" required=true>
95 <TextInput
96 required=true
97 value={(*counter_party_address).to_string()}
98 onchange={onchange_counter_party_address}
99 />
100 </FormGroup>
101 <FormGroup label="Counter Party ID" required=true>
102 <TextInput
103 required=true
104 value={(*counter_party_id).to_string()}
105 onchange={onchange_counter_party_id}
106 />
107 </FormGroup>
108 <FormGroup label="Policy" required=true>
109 <PolicySelector
110 onselect={onselect_policy}
111 selected_policy={(*policy_definition_item).clone()}
112 />
113 </FormGroup>
114 <ActionGroup>
115 <Button
116 variant={ButtonVariant::Primary}
117 label="Submit"
118 r#type={ButtonType::Submit}
119 {disabled}
120 />
121 <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
122 </ActionGroup>
123 </Form>
124 )
125}