Skip to main content

edc_web_ui/components/
create_asset.rs

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