use std::cell::RefCell;
use leptos::prelude::*;
use crate::{
logger,
webapp::{EventHandle, TelegramWebApp}
};
thread_local! {
static SETTINGS_BUTTON_HANDLE: RefCell<Option<EventHandle<dyn FnMut()>>> =
const { RefCell::new(None) };
}
#[component]
pub fn SettingsButton<F>(
#[prop(into)] visible: Signal<bool>,
#[prop(optional)] on_click: Option<F>
) -> impl IntoView
where
F: Fn() + Clone + 'static
{
Effect::new(move |_| {
if let Some(app) = TelegramWebApp::instance() {
let result = if visible.get() {
app.show_settings_button()
} else {
app.hide_settings_button()
};
if let Err(err) = result {
logger::error(&format!("SettingsButton visibility toggle failed: {err:?}"));
}
}
});
if let Some(cb) = on_click
&& let Some(app) = TelegramWebApp::instance()
{
match app.set_settings_button_callback(cb) {
Ok(handle) => SETTINGS_BUTTON_HANDLE.with(|c| {
*c.borrow_mut() = Some(handle);
}),
Err(err) => logger::error(&format!("set_settings_button_callback failed: {err:?}"))
}
}
on_cleanup(move || {
if let Some(app) = TelegramWebApp::instance() {
SETTINGS_BUTTON_HANDLE.with(|c| {
if let Some(handle) = c.borrow_mut().take()
&& let Err(err) = app.remove_settings_button_callback(handle)
{
logger::error(&format!("remove_settings_button_callback failed: {err:?}"));
}
});
if let Err(err) = app.hide_settings_button() {
logger::error(&format!("hide_settings_button failed: {err:?}"));
}
}
});
View::new(())
}