Skip to main content

edc_web_components/components/
create_contract_negotiation.rs

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