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}