telegram_webapp_sdk/webapp/
dialogs.rs

1// SPDX-FileCopyrightText: 2025 RAprogramm <andrey.rozanov.vl@gmail.com>
2// SPDX-License-Identifier: MIT
3
4use js_sys::{Function, Reflect};
5use wasm_bindgen::{JsCast, JsValue, prelude::Closure};
6
7use crate::webapp::TelegramWebApp;
8
9impl TelegramWebApp {
10    /// Call `WebApp.showAlert(message)`.
11    ///
12    /// # Errors
13    /// Returns [`JsValue`] if the underlying JS call fails.
14    pub fn show_alert(&self, msg: &str) -> Result<(), JsValue> {
15        self.call1("showAlert", &msg.into())
16    }
17
18    /// Call `WebApp.showConfirm(message, callback)`.
19    ///
20    /// # Errors
21    /// Returns [`JsValue`] if the underlying JS call fails.
22    pub fn show_confirm<F>(&self, msg: &str, on_confirm: F) -> Result<(), JsValue>
23    where
24        F: 'static + Fn(bool)
25    {
26        let cb = Closure::<dyn FnMut(bool)>::new(on_confirm);
27        let f = Reflect::get(&self.inner, &"showConfirm".into())?;
28        let func = f
29            .dyn_ref::<Function>()
30            .ok_or_else(|| JsValue::from_str("showConfirm is not a function"))?;
31        func.call2(&self.inner, &msg.into(), cb.as_ref().unchecked_ref())?;
32        cb.forget(); // safe leak for JS lifetime
33        Ok(())
34    }
35
36    /// Call `WebApp.showPopup(params, callback)`.
37    ///
38    /// # Examples
39    /// ```no_run
40    /// # use js_sys::Object;
41    /// # use telegram_webapp_sdk::webapp::TelegramWebApp;
42    /// # let app = TelegramWebApp::instance().unwrap();
43    /// let params = Object::new();
44    /// app.show_popup(&params.into(), |id| {
45    ///     let _ = id;
46    /// })
47    /// .unwrap();
48    /// ```
49    pub fn show_popup<F>(&self, params: &JsValue, callback: F) -> Result<(), JsValue>
50    where
51        F: 'static + Fn(String)
52    {
53        let cb = Closure::<dyn FnMut(JsValue)>::new(move |id: JsValue| {
54            callback(id.as_string().unwrap_or_default());
55        });
56        Reflect::get(&self.inner, &"showPopup".into())?
57            .dyn_into::<Function>()?
58            .call2(&self.inner, params, cb.as_ref().unchecked_ref())?;
59        cb.forget();
60        Ok(())
61    }
62
63    /// Call `WebApp.showScanQrPopup(text, callback)`.
64    ///
65    /// # Examples
66    /// ```no_run
67    /// # use telegram_webapp_sdk::webapp::TelegramWebApp;
68    /// # let app = TelegramWebApp::instance().unwrap();
69    /// app.show_scan_qr_popup("Scan", |text| {
70    ///     let _ = text;
71    /// })
72    /// .unwrap();
73    /// ```
74    pub fn show_scan_qr_popup<F>(&self, text: &str, callback: F) -> Result<(), JsValue>
75    where
76        F: 'static + Fn(String)
77    {
78        let cb = Closure::<dyn FnMut(JsValue)>::new(move |value: JsValue| {
79            callback(value.as_string().unwrap_or_default());
80        });
81        Reflect::get(&self.inner, &"showScanQrPopup".into())?
82            .dyn_into::<Function>()?
83            .call2(&self.inner, &text.into(), cb.as_ref().unchecked_ref())?;
84        cb.forget();
85        Ok(())
86    }
87
88    /// Call `WebApp.closeScanQrPopup()`.
89    ///
90    /// # Examples
91    /// ```no_run
92    /// # use telegram_webapp_sdk::webapp::TelegramWebApp;
93    /// # let app = TelegramWebApp::instance().unwrap();
94    /// app.close_scan_qr_popup().unwrap();
95    /// ```
96    pub fn close_scan_qr_popup(&self) -> Result<(), JsValue> {
97        Reflect::get(&self.inner, &"closeScanQrPopup".into())?
98            .dyn_into::<Function>()?
99            .call0(&self.inner)?;
100        Ok(())
101    }
102}