edc_web_components/pages/
show_transfer_process.rs1use crate::components::TransferProcessStatus;
2use crate::contexts::use_edc_connector_context;
3use edc_connector_client::types::transfer_process::TransferProcessState;
4use patternfly_yew::prelude::*;
5use yew::platform::spawn_local;
6use yew::prelude::*;
7use yew::suspense::use_future_with;
8
9#[derive(Clone, Debug, PartialEq, Properties)]
10pub struct ShowTransferProcessPageProps {
11 pub transfer_process_id: String,
12}
13
14#[component]
15pub fn ShowTransferProcessPage(props: &ShowTransferProcessPageProps) -> Html {
16 html!(
17 <>
18 <Title level={Level::H2} size={Size::XXXLarge}>{ "Transfer Process" }</Title>
19 <Suspense fallback="Loading ...">
20 <ShowTransferProcessPageInner transfer_process_id={props.transfer_process_id.clone()} />
21 </Suspense>
22 </>
23 )
24}
25
26#[component]
27pub fn ShowTransferProcessPageInner(props: &ShowTransferProcessPageProps) -> HtmlResult {
28 let edc_connector_client = use_edc_connector_context();
29
30 let refresh = use_state(|| 0usize);
31
32 let transfer_process = use_future_with(
33 (
34 props.transfer_process_id.clone(),
35 edc_connector_client.clone(),
36 refresh.clone(),
37 ),
38 |properties| async move {
39 let (transfer_process_id, edc_connector_client, _) = (*properties).clone();
40
41 if let Some(client) = edc_connector_client.get_client() {
42 client
43 .transfer_processes(edc_connector_client::EdcConnectorApiVersion::V4)
44 .get(&transfer_process_id)
45 .await
46 .ok()
47 } else {
48 None
49 }
50 },
51 )?;
52
53 let on_started = use_callback(refresh.setter(), |_, refresh_setter| {
54 refresh_setter.set(1);
55 });
56
57 let on_finalized = use_callback(refresh.setter(), |_, refresh_setter| {
58 refresh_setter.set(1);
59 });
60
61 let transfer_process = (*transfer_process).clone();
62
63 let do_transfer = use_callback(
64 edc_connector_client.clone(),
65 |transfer_process_id: String, edc_connector_client| {
66 let edc_connector_client = edc_connector_client.clone();
67 let transfer_process_id = transfer_process_id.clone();
68
69 spawn_local(async move {
70 if let Some(client) = edc_connector_client.get_client()
71 && let Ok(data_address) = client
72 .edrs(edc_connector_client::EdcConnectorApiVersion::V3)
73 .get_data_address(&transfer_process_id)
74 .await
75 && let Ok(Some(endpoint)) = data_address.property::<String>("endpoint")
76 && let Ok(Some(authorization)) = data_address.property::<String>("authorization")
77 {
78 let client = reqwest::Client::new();
79
80 if let Ok(response) = client
81 .get(endpoint)
82 .header("Authorization", authorization)
83 .send()
84 .await
85 {
86 let content_type = response
87 .headers()
88 .get("Content-Type")
89 .map(|header_value| {
90 header_value
91 .to_str()
92 .unwrap_or("application/octet-stream")
93 .to_string()
94 })
95 .unwrap_or("application/octet-stream".to_string());
96
97 log::warn!("Response: {:?}", content_type);
98 log::warn!("Response: {:?}", response.status());
99 log::warn!("Response: {:?}", response.text().await);
100 }
101 }
102 });
103 },
104 );
105
106 if let Some(transfer_process) = transfer_process {
107 let transfer_proces_id = transfer_process.id().to_string();
108
109 let start_edrs = if transfer_process.state() == &TransferProcessState::Started {
110 html!(
111 <Button
112 variant={ButtonVariant::Primary}
113 onclick={do_transfer.reform(move |_| transfer_proces_id.clone())}
114 >
115 { "Retrieve Dataset" }
116 </Button>
117 )
118 } else {
119 html!()
120 };
121
122 Ok(html!(
123 <Stack gutter=true>
124 <StackItem>
125 <DescriptionList mode={[DescriptionListMode::Horizontal]}>
126 <DescriptionGroup term="Id">{ transfer_process.id() }</DescriptionGroup>
127 <DescriptionGroup term="Contract Agreement Id">
128 { transfer_process.contract_id() }
129 </DescriptionGroup>
130 <DescriptionGroup term="Correlation Contract Agreement ID">
131 { transfer_process.correlation_id() }
132 </DescriptionGroup>
133 <DescriptionGroup term="Asset ID">{ transfer_process.asset_id() }</DescriptionGroup>
134 <DescriptionGroup term="Transfer Type">
135 { transfer_process.transfer_type() }
136 </DescriptionGroup>
137 </DescriptionList>
138 </StackItem>
139 <StackItem>
140 <TransferProcessStatus
141 transfer_process_id={props.transfer_process_id.clone()}
142 {on_started}
143 {on_finalized}
144 />
145 </StackItem>
146 <StackItem>{ start_edrs }</StackItem>
147 </Stack>
148 ))
149 } else {
150 Ok(html!(
151 format!(
152 "Transfer Process with id {} not found.",
153 props.transfer_process_id
154 )
155 ))
156 }
157}