Skip to main content

edc_web_components/components/
create_transfer_process.rs

1use crate::contexts::use_edc_connector_context;
2use edc_connector_client::EdcConnectorApiVersion;
3use edc_connector_client::types::Protocol;
4use edc_connector_client::types::transfer_process::TransferRequest;
5use patternfly_yew::prelude::*;
6use yew::platform::spawn_local;
7use yew::prelude::*;
8
9#[derive(Clone, Debug, PartialEq, Properties)]
10pub struct CreateTransferProcessProps {
11  #[prop_or_default]
12  pub contract_agreement_id: Option<String>,
13  #[prop_or_default]
14  pub counter_party_address: Option<String>,
15  #[prop_or_default]
16  pub on_create: Callback<String>,
17}
18
19#[component]
20pub fn CreateTransferProcess(props: &CreateTransferProcessProps) -> Html {
21  let edc_connector_context = use_edc_connector_context();
22
23  let contract_agreement_id = use_state(|| props.contract_agreement_id.clone().unwrap_or_default());
24  let counter_party_address = use_state(|| props.counter_party_address.clone().unwrap_or_default());
25  let protocol = use_state(|| "dataspace-protocol-http:2025-1".to_string());
26  let transfer_type = use_state(|| "HttpData-PULL".to_string());
27
28  let onsubmit = use_callback(
29    (
30      edc_connector_context,
31      contract_agreement_id.clone(),
32      counter_party_address.clone(),
33      protocol.clone(),
34      transfer_type.clone(),
35      props.on_create.clone(),
36    ),
37    |event: SubmitEvent,
38     (
39      edc_connector_context,
40      contract_agreement_id,
41      counter_party_address,
42      protocol,
43      transfer_type,
44      on_create,
45    )| {
46      event.prevent_default();
47
48      let edc_connector_context = edc_connector_context.clone();
49      let contract_agreement_id = (**contract_agreement_id).clone();
50      let counter_party_address = (**counter_party_address).clone();
51      let protocol = (**protocol).clone();
52      let transfer_type = (**transfer_type).clone();
53      let on_create = on_create.clone();
54
55      spawn_local(async move {
56        let transfer_request = TransferRequest::builder()
57          .contract_id(contract_agreement_id)
58          .counter_party_address(counter_party_address)
59          .protocol(Protocol::new(&protocol))
60          .transfer_type(transfer_type)
61          .build();
62
63        if let Some(client) = edc_connector_context.get_client()
64          && let Ok(transfer_process) = client
65            .transfer_processes(EdcConnectorApiVersion::V4)
66            .initiate(&transfer_request)
67            .await
68        {
69          on_create.emit(transfer_process.id().to_string());
70        }
71      })
72    },
73  );
74
75  let onchange_contract_agreement_id = use_callback(
76    contract_agreement_id.setter(),
77    move |contract_agreement_id, contract_agreement_id_setter| {
78      contract_agreement_id_setter.set(contract_agreement_id);
79    },
80  );
81
82  let onchange_counter_party_address = use_callback(
83    counter_party_address.setter(),
84    move |counter_party_address, counter_party_address_setter| {
85      counter_party_address_setter.set(counter_party_address);
86    },
87  );
88
89  let onchange_protocol = use_callback(protocol.setter(), move |protocol, protocol_setter| {
90    protocol_setter.set(protocol);
91  });
92
93  let onchange_transfer_type = use_callback(
94    transfer_type.setter(),
95    move |transfer_type, transfer_type_setter| {
96      transfer_type_setter.set(transfer_type);
97    },
98  );
99
100  let disabled = false;
101
102  html!(
103    <Form {onsubmit}>
104      <FormGroup label="Contract ID" required=true>
105        <TextInput
106          required=true
107          value={(*contract_agreement_id).to_string()}
108          onchange={onchange_contract_agreement_id}
109        />
110      </FormGroup>
111      <FormGroup label="Counter Party Address" required=true>
112        <TextInput
113          required=true
114          value={(*counter_party_address).to_string()}
115          onchange={onchange_counter_party_address}
116        />
117      </FormGroup>
118      <FormGroup label="Protocol" required=true>
119        <TextInput required=true value={(*protocol).to_string()} onchange={onchange_protocol} />
120      </FormGroup>
121      <FormGroup label="Transfer Type" required=true>
122        <TextInput
123          required=true
124          value={(*transfer_type).to_string()}
125          onchange={onchange_transfer_type}
126        />
127      </FormGroup>
128      <ActionGroup>
129        <Button
130          variant={ButtonVariant::Primary}
131          label="Submit"
132          r#type={ButtonType::Submit}
133          {disabled}
134        />
135        <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
136      </ActionGroup>
137    </Form>
138  )
139}