telegram_webapp_sdk/utils/
check_env.rs

1use js_sys::Reflect;
2use web_sys::window;
3
4/// Checks if the code is running inside Telegram Mini App.
5pub fn is_telegram_env() -> bool {
6    let win = match window() {
7        Some(w) => w,
8        None => return false
9    };
10
11    let telegram = match Reflect::get(&win, &"Telegram".into()) {
12        Ok(v) if !v.is_undefined() => v,
13        _ => return false
14    };
15
16    let _webapp = match Reflect::get(&telegram, &"WebApp".into()) {
17        Ok(v) if !v.is_undefined() => v,
18        _ => return false
19    };
20
21    true
22}
23
24#[cfg(test)]
25mod tests {
26    use js_sys::{Object, Reflect};
27    use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure};
28    use web_sys::window;
29
30    use super::*;
31
32    wasm_bindgen_test_configure!(run_in_browser);
33
34    #[allow(dead_code)]
35    fn cleanup() {
36        let win = window().unwrap();
37        let _ = Reflect::delete_property(&win, &"Telegram".into());
38    }
39
40    #[wasm_bindgen_test]
41    #[allow(dead_code)]
42    fn returns_false_without_telegram() {
43        cleanup();
44        assert!(!is_telegram_env());
45    }
46
47    #[wasm_bindgen_test]
48    #[allow(dead_code)]
49    fn returns_false_without_webapp() {
50        cleanup();
51        let win = window().unwrap();
52        let telegram = Object::new();
53        let _ = Reflect::set(&win, &"Telegram".into(), &telegram);
54        assert!(!is_telegram_env());
55    }
56
57    #[wasm_bindgen_test]
58    #[allow(dead_code)]
59    fn returns_true_with_telegram_and_webapp() {
60        cleanup();
61        let win = window().unwrap();
62        let telegram = Object::new();
63        let webapp = Object::new();
64        let _ = Reflect::set(&win, &"Telegram".into(), &telegram);
65        let _ = Reflect::set(&telegram, &"WebApp".into(), &webapp);
66        assert!(is_telegram_env());
67    }
68}