use leptos::prelude::*;
use send_wrapper::SendWrapper;
use crate::webapp::{EventHandle, SafeAreaInset, TelegramWebApp};
#[derive(Clone, Debug, PartialEq, Default)]
pub struct SafeAreaState {
pub area: Option<SafeAreaInset>,
pub content: Option<SafeAreaInset>
}
impl SafeAreaState {
fn snapshot(app: Option<&TelegramWebApp>) -> Self {
match app {
Some(app) => Self {
area: app.safe_area_inset(),
content: app.content_safe_area_inset()
},
None => Self::default()
}
}
}
pub fn use_safe_area() -> ReadSignal<SafeAreaState> {
let app = TelegramWebApp::instance();
let signal = RwSignal::new(SafeAreaState::snapshot(app.as_ref()));
if let Some(app) = app {
let writer = signal;
let app_area = app.clone();
let area_handle: Option<EventHandle<dyn FnMut()>> = app
.on_safe_area_changed(move || {
writer.set(SafeAreaState::snapshot(Some(&app_area)));
})
.ok();
let app_content = app.clone();
let content_handle: Option<EventHandle<dyn FnMut()>> = app
.on_content_safe_area_changed(move || {
writer.set(SafeAreaState::snapshot(Some(&app_content)));
})
.ok();
let wrapped = SendWrapper::new((area_handle, content_handle));
on_cleanup(move || {
drop(wrapped);
});
}
signal.read_only()
}