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(¶ms.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}