Skip to main content

edc_web_ui/components/
create_contract_negotiation.rs

1use 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}