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