telegram_webapp_sdk/api/
theme.rs

1// SPDX-FileCopyrightText: 2025 RAprogramm <andrey.rozanov.vl@gmail.com>
2// SPDX-License-Identifier: MIT
3
4use js_sys::Reflect;
5use serde_wasm_bindgen::from_value;
6use wasm_bindgen::prelude::*;
7use web_sys::window;
8
9use crate::core::types::theme_params::TelegramThemeParams;
10
11/// Returns the current themeParams from `Telegram.WebApp.themeParams`.
12///
13/// # Errors
14/// Returns `Err(JsValue)` if the object is missing or cannot be parsed.
15pub fn get_theme_params() -> Result<TelegramThemeParams, JsValue> {
16    let window = window().ok_or_else(|| JsValue::from_str("no window"))?;
17    let telegram = Reflect::get(&window, &JsValue::from_str("Telegram"))?;
18    let webapp = Reflect::get(&telegram, &JsValue::from_str("WebApp"))?;
19    let theme_params = Reflect::get(&webapp, &JsValue::from_str("themeParams"))?;
20    from_value(theme_params)
21        .map_err(|e| JsValue::from_str(&format!("themeParams parse error: {e}")))
22}
23
24#[cfg(test)]
25mod tests {
26    use js_sys::{Object, Reflect};
27    use wasm_bindgen::JsValue;
28    use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure};
29    use web_sys::window;
30
31    use super::*;
32
33    wasm_bindgen_test_configure!(run_in_browser);
34
35    #[allow(dead_code)]
36    fn setup_webapp() -> Object {
37        let win = window().expect("window should be available");
38        let telegram = Object::new();
39        let webapp = Object::new();
40        let _ = Reflect::set(&win, &"Telegram".into(), &telegram);
41        let _ = Reflect::set(&telegram, &"WebApp".into(), &webapp);
42        webapp
43    }
44
45    #[wasm_bindgen_test]
46    #[allow(dead_code)]
47    fn parses_valid_theme() {
48        let webapp = setup_webapp();
49        let theme = Object::new();
50        let _ = Reflect::set(&theme, &"bg_color".into(), &JsValue::from_str("#ffffff"));
51        let _ = Reflect::set(&theme, &"text_color".into(), &JsValue::from_str("#000000"));
52        let _ = Reflect::set(&webapp, &"themeParams".into(), &theme);
53
54        let params = get_theme_params().expect("theme params");
55        assert_eq!(params.bg_color.as_deref(), Some("#ffffff"));
56        assert_eq!(params.text_color.as_deref(), Some("#000000"));
57    }
58
59    #[wasm_bindgen_test]
60    #[allow(dead_code)]
61    fn fails_on_invalid_data() {
62        let webapp = setup_webapp();
63        let _ = Reflect::set(&webapp, &"themeParams".into(), &JsValue::from_f64(5.0));
64        assert!(get_theme_params().is_err());
65    }
66}