use crate::components::error::error_component::ErrorComponent; use crate::components::error::error_provider::ErrorProvider; use crate::event_bus::EventBus; use crate::services::websocket::WebsocketService; use components::admin::Admin; use components::create_achievement::CreateAchievementComponent; use components::create_milestone::CreateMilestoneComponent; use components::root::Root; use std::rc::Rc; use yew::prelude::*; use yew_agent::Bridged; use yew_router::BrowserRouter; use yew_router::Routable; use yew_router::Switch; mod components; pub mod event_bus; mod services; pub mod util; #[derive(Debug, Clone, Copy, PartialEq, Routable)] enum Route { #[at("/")] Root, #[at("/create-achievement")] CreateAchievement, #[at("/create-milestone")] CreateMilestone, #[at("/en-lille-nisse-rejste")] Admin, #[not_found] #[at("/404")] NotFound, } fn switch(selected_route: Route) -> Html { match selected_route { Route::Root => html! {}, Route::Admin => html! {}, Route::CreateAchievement => html! {}, Route::CreateMilestone => html! {}, Route::NotFound => html! {

{"404 not found"}

}, } } #[derive(Default, Clone, Debug, PartialEq, Eq)] struct AppStateInner { /// The part of the state that comes from the server state: common::State, } impl Reducible for AppStateInner { type Action = common::State; fn reduce(self: Rc, action: Self::Action) -> Rc { Rc::new(Self { state: action }) } } type AppState = Rc; #[function_component] pub fn App() -> Html { let app_state = use_reducer(AppStateInner::default); let app_state_dispatcher = app_state.dispatcher(); let _event_bus = use_memo( |_| { log::info!("Creating event bus bridge."); EventBus::::bridge(Rc::new(move |ws_msg: common::State| { log::debug!("dispatching websocket msg to reducer"); app_state_dispatcher.dispatch(ws_msg); })) }, (), ); let _wss = use_memo(|_| Rc::new(WebsocketService::connect()), ()); let rc_app_state = Rc::new((*app_state).clone()); html! { context={rc_app_state}>
render={switch}/>
> } }