use super::*;
impl UseOnlineStatus {
pub(crate) fn new() -> Self {
Self {
online: Signal::create(true),
teardown: Rc::new(RefCell::new(None)),
}
}
pub fn is_online(&self) -> bool {
self.get_online().get()
}
pub(crate) fn attach(&self) {
#[cfg(target_arch = "wasm32")]
{
let Some(window) = browser_window() else {
return;
};
let online: Signal<bool> = self.get_online();
let navigator: Navigator = window.navigator();
online.set(navigator.on_line());
let set_online: Closure<dyn FnMut(Event)> =
Closure::wrap(Box::new(move |_event: Event| {
online.set(true);
}));
let set_offline: Closure<dyn FnMut(Event)> =
Closure::wrap(Box::new(move |_event: Event| {
online.set(false);
}));
if window
.add_event_listener_with_callback(EVENT_ONLINE, set_online.as_ref().unchecked_ref())
.is_err()
{
return;
}
if window
.add_event_listener_with_callback(
EVENT_OFFLINE,
set_offline.as_ref().unchecked_ref(),
)
.is_err()
{
return;
}
*self.get_teardown().borrow_mut() = Some(Box::new(move || {
let _: Result<(), JsValue> = window.remove_event_listener_with_callback(
EVENT_ONLINE,
set_online.as_ref().unchecked_ref(),
);
let _: Result<(), JsValue> = window.remove_event_listener_with_callback(
EVENT_OFFLINE,
set_offline.as_ref().unchecked_ref(),
);
}));
}
}
pub(crate) fn detach(&self) {
let taken: Option<Box<dyn Fn()>> = self.get_teardown().borrow_mut().take();
if let Some(teardown) = taken {
teardown();
}
}
}