use yew::prelude::*; use yew_agent::{Bridge, Bridged}; use yew_router::prelude::*; use crate::agents; use crate::routes; pub enum Msg { LoggedIn(bool), } #[derive(Properties, PartialEq)] pub struct LoggedInProps { #[prop_or_default] pub children: Children, pub logged_in: bool, } pub struct LoggedIn { logged_in: bool, _logged_in_producer: Box>, } impl Component for LoggedIn { type Message = Msg; type Properties = LoggedInProps; fn create(ctx: &Context) -> Self { Self { logged_in: ctx.props().logged_in, _logged_in_producer: agents::logged_in::EventBus::bridge( ctx.link().callback(Msg::LoggedIn), ), } } fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { match msg { Msg::LoggedIn(x) => { let prev = self.logged_in; self.logged_in = x; prev != self.logged_in } } } fn view(&self, ctx: &Context) -> Html { if !self.logged_in { log::info!("Viewing logged in required site while not logged in!"); ctx.link().history().unwrap().push(routes::Route::Login); } html! { if self.logged_in { { for ctx.props().children.iter() } } } } }