diff --git a/app/src/main.rs b/app/src/main.rs index 1d0cda5..8924165 100644 --- a/app/src/main.rs +++ b/app/src/main.rs @@ -1,5 +1,5 @@ use api::{LoginRequest, LoginResponse}; -use gloo_storage::{LocalStorage, Storage, errors::StorageError}; +use gloo_storage::{errors::StorageError, LocalStorage, Storage}; use log::Level; use wasm_bindgen::JsCast; use web_sys::HtmlInputElement; @@ -16,6 +16,10 @@ enum Route { Index, #[at("/login")] Login, + #[at("/ingredients")] + Ingredients, + #[at("/household_select")] + HouseholdSelect, #[at("/404")] #[not_found] NotFound, @@ -30,35 +34,118 @@ fn App() -> Html { } } -fn switch(route: Route) -> Html { - match route { - Route::Index => html! { - - }, - Route::Login => html! { - - }, - Route::NotFound => html! { - "Page not found" - }, +#[derive(Debug, Clone)] +struct RegaladeGlobalState { + token: AttrValue, + household: AttrValue, +} + +impl RegaladeGlobalState { + pub fn get_or_navigate(navigator: Navigator) -> Option { + let token = match LocalStorage::get::("token") { + Ok(v) => v, + Err(StorageError::KeyNotFound(_)) => { + navigator.push(&Route::Login); + return None; + } + Err(e) => unreachable!("Could not get token: {e:?}"), + }; + + let household = match LocalStorage::get::("household") { + Ok(v) => v, + Err(StorageError::KeyNotFound(_)) => { + navigator.push(&Route::HouseholdSelect); + return None; + } + Err(e) => unreachable!("Could not get household: {e:?}"), + }; + + Some(Self { + token: token.into(), + household: household.into(), + }) + } + + pub fn get() -> Self { + let token = match LocalStorage::get::("token") { + Ok(v) => v, + Err(e) => unreachable!("Could not get token: {e:?}"), + }; + + let household = match LocalStorage::get::("household") { + Ok(v) => v, + Err(e) => unreachable!("Could not get household: {e:?}"), + }; + + Self { + token: token.into(), + household: household.into(), + } + } +} + +#[derive(Debug, PartialEq, Properties)] +struct GlobalStateRedirectorProps { + children: Children, + route: Route, +} + +#[function_component] +fn GlobalStateRedirector(props: &GlobalStateRedirectorProps) -> Html { + let navigator = use_navigator().unwrap(); + let state = use_state(|| RegaladeGlobalState::get_or_navigate(navigator)); + + match &*state { + Some(state) => { + html! { + + { for props.children.iter() } + + } + } + None => html! {}, } } #[function_component] -fn Index() -> Html { +fn HouseholdSelection() -> Html { let token = use_state(|| match LocalStorage::get::("token") { Ok(v) => Some(v), Err(StorageError::KeyNotFound(_)) => None, - Err(e) => unreachable!("Could not get token: {e:?}"), + Err(e) => unreachable!("Could not get household: {e:?}"), }); match &*token { - Some(_) => html! { - "Index" - }, None => html! { to={Route::Login} /> }, + Some(_) => html! { + {"Household Selection"} + }, + } +} + +fn switch(route: Route) -> Html { + match route { + Route::Index => html! { + + {"Index"} + + }, + Route::Login => html! { + + }, + Route::Ingredients => html! { + + {"Ingredients"} + + }, + Route::HouseholdSelect => html! { + + }, + Route::NotFound => html! { + "Page not found" + }, } }