telegram_webapp_sdk/webapp/
viewport.rs

1// SPDX-FileCopyrightText: 2025 RAprogramm <andrey.rozanov.vl@gmail.com>
2// SPDX-License-Identifier: MIT
3
4use js_sys::Reflect;
5use wasm_bindgen::JsValue;
6
7use crate::webapp::{TelegramWebApp, types::SafeAreaInset};
8
9impl TelegramWebApp {
10    /// Returns the current viewport height in pixels.
11    ///
12    /// # Examples
13    /// ```no_run
14    /// # use telegram_webapp_sdk::webapp::TelegramWebApp;
15    /// # let app = TelegramWebApp::instance().unwrap();
16    /// let _ = app.viewport_height();
17    /// ```
18    pub fn viewport_height(&self) -> Option<f64> {
19        Reflect::get(&self.inner, &"viewportHeight".into())
20            .ok()?
21            .as_f64()
22    }
23
24    /// Returns the current viewport width in pixels.
25    ///
26    /// # Examples
27    /// ```no_run
28    /// # use telegram_webapp_sdk::webapp::TelegramWebApp;
29    /// # let app = TelegramWebApp::instance().unwrap();
30    /// let _ = app.viewport_width();
31    /// ```
32    pub fn viewport_width(&self) -> Option<f64> {
33        Reflect::get(&self.inner, &"viewportWidth".into())
34            .ok()?
35            .as_f64()
36    }
37
38    /// Returns the stable viewport height in pixels.
39    ///
40    /// # Examples
41    /// ```no_run
42    /// # use telegram_webapp_sdk::webapp::TelegramWebApp;
43    /// # let app = TelegramWebApp::instance().unwrap();
44    /// let _ = app.viewport_stable_height();
45    /// ```
46    pub fn viewport_stable_height(&self) -> Option<f64> {
47        Reflect::get(&self.inner, &"viewportStableHeight".into())
48            .ok()?
49            .as_f64()
50    }
51
52    /// Call `WebApp.expand()` to expand the viewport.
53    ///
54    /// # Errors
55    /// Returns [`JsValue`] if the underlying JS call fails.
56    pub fn expand_viewport(&self) -> Result<(), JsValue> {
57        self.call0("expand")
58    }
59
60    pub(super) fn safe_area_from_property(&self, property: &str) -> Option<SafeAreaInset> {
61        let value = Reflect::get(&self.inner, &property.into()).ok()?;
62        SafeAreaInset::from_js(value)
63    }
64
65    /// Returns the safe area insets reported by Telegram.
66    ///
67    /// # Examples
68    /// ```no_run
69    /// use telegram_webapp_sdk::webapp::TelegramWebApp;
70    ///
71    /// if let Some(app) = TelegramWebApp::instance() {
72    ///     let _ = app.safe_area_inset();
73    /// }
74    /// ```
75    pub fn safe_area_inset(&self) -> Option<SafeAreaInset> {
76        self.safe_area_from_property("safeAreaInset")
77    }
78
79    /// Returns the content safe area insets reported by Telegram.
80    ///
81    /// # Examples
82    /// ```no_run
83    /// use telegram_webapp_sdk::webapp::TelegramWebApp;
84    ///
85    /// if let Some(app) = TelegramWebApp::instance() {
86    ///     let _ = app.content_safe_area_inset();
87    /// }
88    /// ```
89    pub fn content_safe_area_inset(&self) -> Option<SafeAreaInset> {
90        self.safe_area_from_property("contentSafeAreaInset")
91    }
92}