use crate::*;
const MOBILE_BREAKPOINT: i32 = 768;
pub fn current_route() -> String {
let window: Window = window().expect("no global window exists");
let hash: String = window.location().hash().unwrap_or_default();
let route: String = hash.strip_prefix('#').unwrap_or(&hash).to_string();
if route.is_empty() {
"/".to_string()
} else {
route
}
}
pub fn navigate(route: &str) {
let window: Window = window().expect("no global window exists");
let location: Location = window.location();
let new_hash: String = format!("#{}", route);
let _ = location.set_hash(&new_hash);
}
pub fn link_handler(route: String) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
navigate(&route);
})
}
pub fn use_hash_change(route_signal: Signal<String>) {
let window: Window = window().expect("no global window exists");
let closure: Closure<dyn FnMut()> = Closure::wrap(Box::new(move || {
let new_route: String = current_route();
route_signal.set(new_route);
}));
let _ = window.add_event_listener_with_callback(
&NativeEventName::HashChange.to_string(),
closure.as_ref().unchecked_ref(),
);
closure.forget();
}
pub fn is_mobile() -> bool {
let window: Window = window().expect("no global window exists");
let width: i32 = window
.inner_width()
.ok()
.and_then(|v| v.as_f64())
.map(|v| v as i32)
.unwrap_or(0);
width < MOBILE_BREAKPOINT
}
pub fn use_resize() -> Signal<bool> {
let mobile_signal: Signal<bool> = use_signal(is_mobile);
let window: Window = window().expect("no global window exists");
let closure: Closure<dyn FnMut()> = Closure::wrap(Box::new(move || {
let mobile: bool = is_mobile();
mobile_signal.set(mobile);
}));
let _ = window.add_event_listener_with_callback(
&NativeEventName::Other("resize".to_string()).to_string(),
closure.as_ref().unchecked_ref(),
);
closure.forget();
mobile_signal
}