edc-web-ui 0.3.1

A Rust Web interface with patternfly-yew client for EDC
use patternfly_yew::prelude::*;
use yew::prelude::*;

#[cfg(target_arch = "wasm32")]
static COOKIE_NAME: &str = "X-EDC-Web-UI-Theme";
#[cfg(target_arch = "wasm32")]
static DARK_THEME_VALUE: &str = "edc-web-ui-dark";

#[component]
pub fn ToggleTheme() -> Html {
  let is_dark_theme = use_state(get_is_dark_theme_from_cookie);
  let on_theme_switch = use_callback(is_dark_theme.setter(), |_, is_dark_theme| {
    toggle_theme();
    is_dark_theme.set(get_is_dark_theme_from_cookie());
  });

  use_effect_with((), |_| {
    init_page_dark_light_theme();
  });

  let label = if *is_dark_theme {
    "Dark Theme"
  } else {
    "Light Theme"
  };

  html!(<Button variant={ButtonVariant::Tertiary} onclick={on_theme_switch} {label} />)
}

pub(crate) fn get_is_dark_theme_from_cookie() -> bool {
  #[cfg(target_arch = "wasm32")]
  if let Some(Ok(value)) = wasm_cookies::get(COOKIE_NAME) {
    value == DARK_THEME_VALUE
  } else {
    false
  }

  #[cfg(not(target_arch = "wasm32"))]
  false
}

pub fn toggle_theme() {
  #[cfg(target_arch = "wasm32")]
  wasm_cookies::set(
    COOKIE_NAME,
    if get_is_dark_theme_from_cookie() {
      "li-light"
    } else {
      DARK_THEME_VALUE
    },
    &wasm_cookies::CookieOptions::default(),
  );

  init_page_dark_light_theme();
}

pub fn init_page_dark_light_theme() {
  let document_element = gloo_utils::document_element();

  let class = if get_is_dark_theme_from_cookie() {
    "pf-v6-theme-dark"
  } else {
    Default::default()
  };

  document_element.set_class_name(class);
}