telegram_webapp_sdk/leptos/
theme.rs1use leptos::prelude::*;
5use send_wrapper::SendWrapper;
6
7use crate::{
8 api::theme::get_theme_params, core::types::theme_params::TelegramThemeParams,
9 webapp::TelegramWebApp
10};
11
12#[derive(Clone, Debug, PartialEq, Default)]
14pub struct ThemeState {
15 pub color_scheme: Option<String>,
17 pub params: TelegramThemeParams
19}
20
21impl ThemeState {
22 fn snapshot(app: Option<&TelegramWebApp>) -> Self {
23 let color_scheme = app.and_then(|a| a.color_scheme());
24 let params = get_theme_params().unwrap_or_default();
25 Self {
26 color_scheme,
27 params
28 }
29 }
30}
31
32pub fn use_theme() -> ReadSignal<ThemeState> {
48 let app = TelegramWebApp::instance();
49 let signal = RwSignal::new(ThemeState::snapshot(app.as_ref()));
50
51 if let Some(app) = app {
52 let app_for_handler = app.clone();
53 let writer = signal;
54 if let Ok(handle) = app.on_theme_changed(move || {
55 writer.set(ThemeState::snapshot(Some(&app_for_handler)));
56 }) {
57 let wrapped = SendWrapper::new(handle);
58 on_cleanup(move || {
59 drop(wrapped);
60 });
61 }
62 }
63
64 signal.read_only()
65}