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