edc-web-components 0.8.1

A Rust Web Components with patternfly-yew client for EDC
Documentation
use crate::components::one_state_selector::OneStateSelector;
use crate::contexts::use_edc_connector_context;
use edc_connector_client::EdcConnectorApiVersion;
use patternfly_yew::prelude::*;
use yew::prelude::*;
use yew::suspense::use_future_with;

#[derive(Clone, Debug, PartialEq, Properties)]
pub struct DatasourceSelectorProps {
  pub selected_kind: String,
  pub on_selected_kind: Callback<String>,
}

#[component]
pub fn DatasourceSelector(props: &DatasourceSelectorProps) -> Html {
  html! {
    <Suspense fallback={html!(<Bullseye><Spinner /></Bullseye>)}>
      <DatasourceSelectorInner
        selected_kind={props.selected_kind.clone()}
        on_selected_kind={props.on_selected_kind.clone()}
      />
    </Suspense>
  }
}

#[component]
pub fn DatasourceSelectorInner(props: &DatasourceSelectorProps) -> HtmlResult {
  let edc_connector_context = use_edc_connector_context();

  let datasource_types = use_future_with(
    edc_connector_context.clone(),
    async |edc_connector_context| {
      if let Some(edc_connector_client) = edc_connector_context.get_client() {
        let mut datasource_types = edc_connector_client
          .data_planes(EdcConnectorApiVersion::V4)
          .list()
          .await
          .unwrap_or_default()
          .into_iter()
          .flat_map(|dataplane| dataplane.allowed_source_types().to_vec())
          .collect::<Vec<String>>();

        datasource_types.dedup();
        datasource_types.sort();

        datasource_types
      } else {
        vec![]
      }
    },
  )?;

  let items = (*datasource_types).clone();

  Ok(html!(
    <OneStateSelector
      selectable_items={items}
      selected_item={props.selected_kind.clone()}
      on_selected={props.on_selected_kind.clone()}
      default_label="Select a Data Source Type"
    />
  ))
}