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"
+ },
}
}