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);
}