use crate::event_bus::EventBus; use crate::services::websocket::WebsocketService; use crate::AppState; use crate::Route; use common::Achievement; use std::rc::Rc; use yew::functional::*; use yew::prelude::*; use yew_agent::Bridge; use yew_agent::Bridged; use yew_router::prelude::*; pub struct Root { wss: WebsocketService, _producer: Box>, achievements: Vec, } pub enum Msg { HandleMsg(String), } impl Component for Root { type Message = Msg; type Properties = (); fn create(ctx: &Context) -> Self { // let ctx_link = ctx // .link() // .context::(Callback::noop()) // .expect("context to be set"); let wss = WebsocketService::new(); let cb = { let link = ctx.link().clone(); move |e| link.send_message(Msg::HandleMsg(e)) }; Self { wss, _producer: EventBus::bridge(Rc::new(cb)), achievements: vec![], } } fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { match msg { Msg::HandleMsg(s) => { let msg: common::WebSocketMessage = serde_json::from_str(&s).unwrap(); self.achievements = msg.achievements; true } } } fn view(&self, ctx: &Context) -> Html { let achievements = self .achievements .iter() .map(|a| { html! {

{format!("{}", a.goal)}

} }) .collect::(); html! {
{achievements}
} } }