use std::rc::Rc;
use gloo_events::EventListener;
use yew::prelude::*;
use yew::suspense::SuspensionResult;
use crate::arch::window;
#[cfg(feature = "yew_use_media_query")]
#[hook]
pub fn use_media_query(query: &str) -> bool {
let query: Rc<str> = Rc::from(query);
let match_media = {
let query = query.clone();
move || {
window()
.ok()
.and_then(|m| m.match_media(&query.clone()).ok())
.flatten()
.expect("Failed to query media")
}
};
let state = use_state_eq(|| match_media().matches());
let state_clone = state.clone();
use_effect_with(query, move |_| {
let match_media = match_media();
let match_media_clone = match_media.clone();
let listener = EventListener::new(&match_media, "change", move |_event| {
state_clone.set(match_media_clone.matches());
});
move || {
drop(listener);
}
});
*state
}
#[cfg(feature = "yew_use_media_query")]
#[hook]
pub fn use_prepared_media_query(query: &str, fallback: bool) -> SuspensionResult<bool> {
let query: Rc<str> = Rc::from(query);
let try_match_media = {
let query = query.clone();
move || {
window()
.ok()
.and_then(|m| m.match_media(&query.clone()).ok())
.flatten()
}
};
let prepared_fallback = use_prepared_state!((), |_| -> bool { fallback })?;
let state = use_state_eq(|| {
prepared_fallback
.as_deref()
.cloned()
.or_else(|| try_match_media().map(|m| m.matches()))
.unwrap_or(fallback)
});
let state_clone = state.clone();
use_effect_with(query, move |_| {
let match_media = try_match_media().expect("Failed to query media");
let match_media_clone = match_media.clone();
state_clone.set(match_media.matches());
let listener = EventListener::new(&match_media, "change", move |_event| {
state_clone.set(match_media_clone.matches());
});
move || {
drop(listener);
}
});
Ok(*state)
}