use leptos::prelude::*;
use send_wrapper::SendWrapper;
use crate::webapp::TelegramWebApp;
#[derive(Clone, Debug, PartialEq, Default)]
pub struct ViewportState {
pub height: f64,
pub stable_height: f64,
pub is_expanded: bool
}
impl ViewportState {
fn snapshot(app: Option<&TelegramWebApp>) -> Self {
match app {
Some(app) => Self {
height: app.viewport_height().unwrap_or(0.0),
stable_height: app.viewport_stable_height().unwrap_or(0.0),
is_expanded: app.is_expanded()
},
None => Self::default()
}
}
}
pub fn use_viewport() -> ReadSignal<ViewportState> {
let app = TelegramWebApp::instance();
let signal = RwSignal::new(ViewportState::snapshot(app.as_ref()));
if let Some(app) = app {
let app_for_handler = app.clone();
let writer = signal;
if let Ok(handle) = app.on_viewport_changed(move || {
writer.set(ViewportState::snapshot(Some(&app_for_handler)));
}) {
let wrapped = SendWrapper::new(handle);
on_cleanup(move || {
drop(wrapped);
});
}
}
signal.read_only()
}