telegram_webapp_sdk/api/
theme.rs

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