Skip to main content

edc_web_components/pages/
transfer_process_page.rs

1use crate::components::ListTransferProcesses;
2use crate::contexts::use_edc_connector_context;
3use crate::models::TransferProcessItem;
4use edc_connector_client::types::query::SortOrder;
5use edc_connector_client::{EdcConnectorApiVersion, types::query::Query};
6use patternfly_yew::prelude::*;
7use yew::prelude::*;
8use yew::suspense::use_future_with;
9
10#[derive(Clone, Debug, PartialEq, Properties)]
11pub struct TransferProcessPageProps {
12  #[prop_or("Transfers".to_string())]
13  pub title: String,
14  #[prop_or(None)]
15  pub tag_line: Option<String>,
16  #[prop_or_default]
17  pub contract_agreement_id: Option<String>,
18  #[prop_or_default]
19  pub onshow: Callback<String>,
20}
21
22#[component]
23pub fn TransferProcessPage(props: &TransferProcessPageProps) -> Html {
24  let tag_line = props
25    .tag_line
26    .as_ref()
27    .map(|tag_line| html!(<p>{ tag_line }</p>))
28    .unwrap_or_default();
29
30  let refresh = use_state(|| 0usize);
31  let offset = use_state(|| 0usize);
32  let limit = use_state(|| 10usize);
33
34  let onoffset = use_callback(
35    (refresh.clone(), offset.setter()),
36    |offset, (refresh, offset_setter)| {
37      offset_setter.set(offset);
38      refresh.set(**refresh + 1);
39    },
40  );
41
42  let onlimit = use_callback(
43    (refresh.clone(), limit.setter()),
44    |limit, (refresh, limit_setter)| {
45      limit_setter.set(limit);
46      refresh.set(**refresh + 1);
47    },
48  );
49
50  html!(
51    <Stack gutter=true>
52      <StackItem>
53        <Title level={Level::H3} size={Size::XXLarge}>{ &props.title }</Title>
54        { tag_line }
55      </StackItem>
56      <StackItem>
57        <Suspense>
58          <TransferProcessPageInner
59            offset={*offset}
60            limit={*limit}
61            {onoffset}
62            {onlimit}
63            contract_agreement_id={props.contract_agreement_id.clone()}
64            force_refresh={*refresh}
65            onshow={props.onshow.clone()}
66          />
67        </Suspense>
68      </StackItem>
69    </Stack>
70  )
71}
72
73#[derive(Clone, Debug, PartialEq, Properties)]
74pub struct TransferProcessPageInnerProps {
75  pub offset: usize,
76  pub limit: usize,
77  pub onoffset: Callback<usize>,
78  pub onlimit: Callback<usize>,
79  pub contract_agreement_id: Option<String>,
80  pub force_refresh: usize,
81  pub onshow: Callback<String>,
82}
83
84#[component]
85pub fn TransferProcessPageInner(props: &TransferProcessPageInnerProps) -> HtmlResult {
86  let edc_connector_context = use_edc_connector_context();
87
88  let transfer_processe_items = use_future_with(
89    (
90      edc_connector_context,
91      props.limit,
92      props.offset,
93      props.contract_agreement_id.clone(),
94      props.force_refresh,
95    ),
96    |parameters| async move {
97      let (edc_connector_context, limit, offset, contract_agreement_id, _) = (*parameters).clone();
98
99      let query_builder = Query::builder().limit(limit as u32).offset(offset as u32);
100
101      let query_builder = if let Some(contract_agreement_id) = contract_agreement_id {
102        query_builder.filter("contractId", "=", contract_agreement_id)
103      } else {
104        query_builder
105      };
106
107      let query = query_builder
108        .sort("stateTimestamp", SortOrder::Desc)
109        .build();
110
111      if let Some(client) = edc_connector_context.get_client() {
112        client
113          .transfer_processes(EdcConnectorApiVersion::V4)
114          .query(query)
115          .await
116          .unwrap_or_default()
117          .into_iter()
118          .map(TransferProcessItem::from)
119          .collect::<Vec<_>>()
120      } else {
121        vec![]
122      }
123    },
124  )?;
125
126  let transfer_processe_items = (*transfer_processe_items).clone();
127
128  Ok(html!(
129    <ListTransferProcesses
130      transfer_processe_items={transfer_processe_items}
131      offset={props.offset}
132      limit={props.limit}
133      onoffset={props.onoffset.clone()}
134      onlimit={props.onlimit.clone()}
135      onshow={props.onshow.clone()}
136    />
137  ))
138}