edc_web_ui/components/
create_asset.rs1use crate::contexts::use_edc_connector_context;
2use edc_connector_client::types::{asset::NewAsset, data_address::DataAddress};
3use patternfly_yew::prelude::*;
4use std::collections::HashMap;
5use yew::platform::spawn_local;
6use yew::prelude::*;
7
8#[derive(Clone, Debug, PartialEq, Properties)]
9pub struct CreateAssetProps {
10 #[prop_or_default]
11 pub on_create: Callback<()>,
12}
13
14#[component]
15pub fn CreateAsset(props: &CreateAssetProps) -> Html {
16 let edc_connector_context = use_edc_connector_context();
17
18 let identifier = use_state(|| "".to_string());
19 let name = use_state(|| "".to_string());
20 let base_url = use_state(|| "".to_string());
21 let content_type = use_state(|| "".to_string());
22 let proxy_path = use_state(|| false);
23 let proxy_query_params = use_state(|| false);
24 let proxy_method = use_state(|| false);
25 let proxy_body = use_state(|| false);
26 let headers = use_state(HashMap::<String, String>::new);
27
28 let onsubmit = use_callback(
29 (
30 edc_connector_context.clone(),
31 identifier.clone(),
32 name.clone(),
33 base_url.clone(),
34 content_type.clone(),
35 proxy_path.clone(),
36 proxy_query_params.clone(),
37 proxy_method.clone(),
38 proxy_body.clone(),
39 headers.clone(),
40 props.on_create.clone(),
41 ),
42 |event: SubmitEvent,
43 (
44 edc_connector_context,
45 identifier,
46 name,
47 base_url,
48 content_type,
49 proxy_path,
50 proxy_query_params,
51 proxy_method,
52 proxy_body,
53 headers,
54 on_create,
55 )| {
56 event.prevent_default();
57
58 let identifier = (**identifier).clone();
59 let name = (**name).clone();
60 let base_url = (**base_url).clone();
61 let content_type = (**content_type).clone();
62 let proxy_path = **proxy_path;
63 let proxy_query_params = **proxy_query_params;
64 let proxy_method = **proxy_method;
65 let proxy_body = **proxy_body;
66 let headers = (**headers).clone();
67 let edc_connector_context = edc_connector_context.clone();
68 let on_create = on_create.clone();
69
70 spawn_local(async move {
71 let mut data_address_builder = DataAddress::builder()
72 .kind("HttpData")
73 .property("baseUrl", base_url)
74 .property("proxyPath", if proxy_path { "true" } else { "false" })
75 .property(
76 "proxyQueryParams",
77 if proxy_query_params { "true" } else { "false" },
78 )
79 .property("proxyMethod", if proxy_method { "true" } else { "false" })
80 .property("proxyBody", if proxy_body { "true" } else { "false" });
81
82 for (key, value) in &headers {
83 data_address_builder = data_address_builder.property(&format!("header:{key}"), value);
84 }
85
86 let data_address = data_address_builder.build().unwrap();
87
88 let new_asset = NewAsset::builder()
89 .id(&identifier)
90 .data_address(data_address)
91 .property("name", name)
92 .property("contenttype", content_type)
93 .build();
94
95 if let Some(client) = edc_connector_context.get_client() {
96 if let Err(error) = client.assets().create(&new_asset).await {
97 log::error!("Error creating asset: {}", error);
98 } else {
99 on_create.emit(());
100 }
101 }
102 })
103 },
104 );
105
106 let onchange_identifier = use_callback(identifier.setter(), |value, identifier_setter| {
107 identifier_setter.set(value);
108 });
109
110 let onchange_name = use_callback(name.setter(), |value, name_setter| {
111 name_setter.set(value);
112 });
113
114 let onchange_base_url = use_callback(base_url.setter(), |value, base_url_setter| {
115 base_url_setter.set(value);
116 });
117
118 let onchange_content_type = use_callback(content_type.setter(), |value, content_type_setter| {
119 content_type_setter.set(value);
120 });
121
122 let onchange_proxy_path = use_callback(proxy_path.setter(), |value, proxy_path_setter| {
123 proxy_path_setter.set(value);
124 });
125
126 let onchange_proxy_query_params = use_callback(
127 proxy_query_params.setter(),
128 |value, proxy_query_params_setter| {
129 proxy_query_params_setter.set(value);
130 },
131 );
132
133 let onchange_proxy_method = use_callback(proxy_method.setter(), |value, proxy_method_setter| {
134 proxy_method_setter.set(value);
135 });
136
137 let onchange_proxy_body = use_callback(proxy_body.setter(), |value, proxy_body_setter| {
138 proxy_body_setter.set(value);
139 });
140
141 let disabled = false;
142
143 html!(
144 <Form {onsubmit}>
145 <FormGroup label="Identifier" required=true>
146 <TextInput required=true value={(*identifier).to_string()} onchange={onchange_identifier} />
147 </FormGroup>
148 <FormGroup label="Name" required=true>
149 <TextInput required=true value={(*name).to_string()} onchange={onchange_name} />
150 </FormGroup>
151 <FormGroup label="Base URL" required=true>
152 <TextInput
153 required=true
154 value={(*base_url).to_string()}
155 onchange={onchange_base_url}
156 r#type={TextInputType::Url}
157 />
158 </FormGroup>
159 <FormGroup label="Content Type">
160 <TextInput value={(*content_type).to_string()} onchange={onchange_content_type} />
161 </FormGroup>
162 <FormGroup label="Proxy Path">
163 <Switch checked={*proxy_path} onchange={onchange_proxy_path} />
164 </FormGroup>
165 <FormGroup label="Proxy Query Parameters">
166 <Switch checked={*proxy_query_params} onchange={onchange_proxy_query_params} />
167 </FormGroup>
168 <FormGroup label="Proxy Method">
169 <Switch checked={*proxy_method} onchange={onchange_proxy_method} />
170 </FormGroup>
171 <FormGroup label="Proxy Body">
172 <Switch checked={*proxy_body} onchange={onchange_proxy_body} />
173 </FormGroup>
174 <ActionGroup>
175 <Button
176 variant={ButtonVariant::Primary}
177 label="Submit"
178 r#type={ButtonType::Submit}
179 {disabled}
180 />
181 <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
182 </ActionGroup>
183 </Form>
184 )
185}