edc-web-ui 0.2.0

A Rust Web interface with patternfly-yew client for EDC
Documentation
use crate::components::PolicySelector;
use crate::contexts::use_edc_connector_context;
use crate::models::PolicyDefinitionItem;
use edc_connector_client::types::contract_negotiation::ContractRequest;
use patternfly_yew::prelude::*;
use yew::platform::spawn_local;
use yew::prelude::*;

#[derive(Clone, Debug, PartialEq, Properties)]
pub struct CreateContractNegotiationProps {
  #[prop_or_default]
  pub on_create: Callback<()>,
}

#[component]
pub fn CreateContractNegotiation(props: &CreateContractNegotiationProps) -> Html {
  let edc_connector_context = use_edc_connector_context();

  let counter_party_address = use_state(String::new);
  let counter_party_id = use_state(String::new);
  let policy_definition_item = use_state(|| Option::<PolicyDefinitionItem>::None);

  let onsubmit = use_callback(
    (
      edc_connector_context.clone(),
      counter_party_address.clone(),
      counter_party_id.clone(),
      policy_definition_item.clone(),
      props.on_create.clone(),
    ),
    |event: SubmitEvent,
     (
      edc_connector_context,
      counter_party_address,
      counter_party_id,
      policy_definition_item,
      oncreate,
    )| {
      event.prevent_default();

      let edc_connector_context = edc_connector_context.clone();
      let counter_party_address = (**counter_party_address).clone();
      let counter_party_id = (**counter_party_id).clone();
      let policy_definition_item = (**policy_definition_item).clone();
      let oncreate = oncreate.clone();

      spawn_local(async move {
        if let Some(policy_definition_item) = policy_definition_item
          && let Some(client) = edc_connector_context.get_client()
          && let Ok(policy_definition) = client.policies().get(&policy_definition_item.id).await
        {
          let contract_request = ContractRequest::builder()
            .counter_party_address(counter_party_address)
            .counter_party_id(counter_party_id)
            .policy(policy_definition.policy().clone())
            .build();

          let _ = client
            .contract_negotiations()
            .initiate(&contract_request)
            .await;

          oncreate.emit(());
        }
      })
    },
  );

  let onchange_counter_party_address = use_callback(
    counter_party_address.setter(),
    move |counter_party_address, counter_party_address_setter| {
      counter_party_address_setter.set(counter_party_address);
    },
  );

  let onchange_counter_party_id = use_callback(
    counter_party_id.setter(),
    move |counter_party_id, counter_party_id_setter| {
      counter_party_id_setter.set(counter_party_id);
    },
  );

  let onselect_policy = use_callback(
    policy_definition_item.setter(),
    move |policy_definition_item, policy_definition_item_setter| {
      policy_definition_item_setter.set(Some(policy_definition_item));
    },
  );

  let disabled = (*policy_definition_item).is_none();

  html!(
    <Form {onsubmit}>
      <FormGroup label="Counter Party Address" required=true>
        <TextInput
          required=true
          value={(*counter_party_address).to_string()}
          onchange={onchange_counter_party_address}
        />
      </FormGroup>
      <FormGroup label="Counter Party ID" required=true>
        <TextInput
          required=true
          value={(*counter_party_id).to_string()}
          onchange={onchange_counter_party_id}
        />
      </FormGroup>
      <FormGroup label="Policy" required=true>
        <PolicySelector
          onselect={onselect_policy}
          selected_policy={(*policy_definition_item).clone()}
        />
      </FormGroup>
      <ActionGroup>
        <Button
          variant={ButtonVariant::Primary}
          label="Submit"
          r#type={ButtonType::Submit}
          {disabled}
        />
        <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
      </ActionGroup>
    </Form>
  )
}