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