use anymap2::AnyMap;
use yew::prelude::*;
use crate::root_state::BounceRootState;
#[derive(Properties, Debug, PartialEq, Clone)]
pub struct BounceRootProps {
#[prop_or_default]
pub children: Children,
#[prop_or_default]
pub get_init_states: Option<Callback<(), AnyMap>>,
}
#[function_component(BounceRoot)]
pub fn bounce_root(props: &BounceRootProps) -> Html {
let BounceRootProps {
children,
get_init_states,
} = props.clone();
let root_state = (*use_state(move || {
let init_states = get_init_states.map(|m| m.emit(())).unwrap_or_default();
BounceRootState::new(init_states)
}))
.clone();
#[allow(clippy::redundant_clone)]
{
let root_state = root_state.clone();
use_effect_with((), move |_| {
move || {
root_state.clear();
}
});
}
#[allow(clippy::unused_unit, clippy::redundant_clone)]
{
let _root_state = root_state.clone();
let _ = use_transitive_state!((), move |_| -> () {
#[cfg(feature = "ssr")]
#[cfg(feature = "helmet")]
{
use crate::helmet::StaticWriterState;
let states = _root_state.states();
let writer_state = states.get_atom_value::<StaticWriterState>();
if let Some(ref w) = writer_state.writer {
w.send_helmet(
states,
writer_state.format_title.clone(),
writer_state.default_title.clone(),
);
}
}
_root_state.clear();
});
}
html! {
<ContextProvider<BounceRootState> context={root_state}>{children}</ContextProvider<BounceRootState>>
}
}