use crate::app::{dom, templates};
pub(super) fn toggle_theme() {
set_render_mode("theme-light", "lh-theme", "light", "dark");
}
pub(super) fn toggle_preview() {
set_render_mode("preview-mobile", "lh-preview", "mobile", "desktop");
}
pub(super) fn set_theme_light(light: bool) -> bool {
if html_has_class("theme-light") == light {
return false;
}
toggle_theme();
true
}
pub(super) fn set_view_desktop(desktop: bool) -> bool {
let currently_desktop = !html_has_class("preview-mobile");
if currently_desktop == desktop {
return false;
}
toggle_preview();
true
}
fn html_has_class(class: &str) -> bool {
web_sys::window()
.and_then(|w| w.document())
.and_then(|d| d.document_element())
.map(|h| h.class_list().contains(class))
.unwrap_or(false)
}
fn set_render_mode(class: &str, key: &str, on_val: &str, off_val: &str) {
let Some(win) = web_sys::window() else { return };
let Some(html) = win.document().and_then(|d| d.document_element()) else {
return;
};
let list = html.class_list();
let next_on = !list.contains(class);
if next_on {
let _ = list.add_1(class);
} else {
let _ = list.remove_1(class);
}
if let Ok(Some(storage)) = win.local_storage() {
let _ = storage.set_item(key, if next_on { on_val } else { off_val });
}
dom::swap_outer(
"display-toggles",
&templates::display_toggles().into_string(),
);
}
pub(super) fn reset_confirm_pressed() {
let typed = dom::input_by_id("reset-confirm-text")
.map(|i| i.value().trim().to_string())
.unwrap_or_default();
if !typed.eq_ignore_ascii_case("RESET") {
dom::swap_inner(
"reset-confirm-msg",
"<span style=\"color:var(--error)\">type RESET to confirm</span>",
);
return;
}
wasm_bindgen_futures::spawn_local(async move {
let fs = crate::app::shared_opfs();
if let Ok(entries) = fs.read_dir("").await {
for entry in entries {
let _ = fs.delete(&entry.name).await;
}
}
if let Ok(window) = dom::window() {
let _ = window.location().reload();
}
});
}