Skip to main content

edc_web_components/pages/
show_transfer_process.rs

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