use std::rc::Rc;
use crate::{SideEffect, SideEffectProvider, SideEffects};
use gloo_utils::document;
use yew::prelude::*;
#[doc(hidden)]
#[derive(Debug, Clone, PartialEq)]
pub struct TitleSideEffect {
value: String,
}
#[derive(Properties, Clone)]
pub struct TitleProviderProps {
pub default_title: String,
pub format_title: Rc<dyn Fn(&str) -> String>,
pub children: Children,
}
#[allow(clippy::vtable_address_comparisons)]
impl PartialEq for TitleProviderProps {
fn eq(&self, rhs: &Self) -> bool {
self.default_title == rhs.default_title
&& self.children == rhs.children
&& Rc::ptr_eq(&self.format_title, &rhs.format_title)
}
}
#[function_component(TitleProvider)]
pub fn title_provider(props: &TitleProviderProps) -> Html {
let children = props.children.clone();
let format_title = props.format_title.clone();
let default_title = props.default_title.clone();
let sync_title = Rc::new(move |titles: SideEffects<TitleSideEffect>| {
let title = if let Some(m) = titles.last().map(|m| m.value.as_ref()) {
format_title(m)
} else {
default_title.clone()
};
document().set_title(&title);
}) as Rc<dyn Fn(SideEffects<TitleSideEffect>)>;
html! {<SideEffectProvider<TitleSideEffect> on_change={sync_title}>{children}</SideEffectProvider<TitleSideEffect>>}
}
#[doc(hidden)]
#[derive(Properties, Clone, PartialEq)]
pub struct TitleProps {
pub value: String,
}
#[function_component(Title)]
pub fn title(props: &TitleProps) -> Html {
let effect = Rc::new(TitleSideEffect {
value: props.value.clone(),
});
html! {<SideEffect<TitleSideEffect> value={effect} />}
}