edc_web_components/components/
create_transfer_process.rs1use 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}