use leptos::prelude::*;
use send_wrapper::SendWrapper;
use crate::{
api::theme::get_theme_params, core::types::theme_params::TelegramThemeParams,
webapp::TelegramWebApp
};
#[derive(Clone, Debug, PartialEq, Default)]
pub struct ThemeState {
pub color_scheme: Option<String>,
pub params: TelegramThemeParams
}
impl ThemeState {
fn snapshot(app: Option<&TelegramWebApp>) -> Self {
let color_scheme = app.and_then(|a| a.color_scheme());
let params = get_theme_params().unwrap_or_default();
Self {
color_scheme,
params
}
}
}
pub fn use_theme() -> ReadSignal<ThemeState> {
let app = TelegramWebApp::instance();
let signal = RwSignal::new(ThemeState::snapshot(app.as_ref()));
if let Some(app) = app {
let app_for_handler = app.clone();
let writer = signal;
if let Ok(handle) = app.on_theme_changed(move || {
writer.set(ThemeState::snapshot(Some(&app_for_handler)));
}) {
let wrapped = SendWrapper::new(handle);
on_cleanup(move || {
drop(wrapped);
});
}
}
signal.read_only()
}