telegram_webapp_sdk/api/
theme.rs1use 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
11pub 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}