From 26142084f680e8a5be53329cd6c69ede24d1a319 Mon Sep 17 00:00:00 2001 From: Franz Dietrich Date: Thu, 27 May 2021 07:26:39 +0200 Subject: [PATCH] Prepare loading state --- app/src/lib.rs | 11 ++++++----- shared/src/datatypes.rs | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/src/lib.rs b/app/src/lib.rs index d04ca80..c724d29 100644 --- a/app/src/lib.rs +++ b/app/src/lib.rs @@ -10,6 +10,7 @@ use seed::input; use seed::label; use seed::{div, log, prelude::*, App, Url, C}; use shared::apirequests::users::LoginUser; +use shared::datatypes::Loadable; use shared::datatypes::User; use crate::i18n::{I18n, Lang}; @@ -31,7 +32,7 @@ fn init(url: Url, orders: &mut impl Orders) -> Model { base_url: Url::new().add_path_part("app"), page: Page::init(url, orders, lang.clone()), i18n: lang, - user: None, + user: Loadable::Data(None), login_form: LoginForm::default(), login_data: LoginUser::default(), } @@ -47,7 +48,7 @@ struct Model { base_url: Url, page: Page, i18n: i18n::I18n, - user: Option, + user: Loadable, login_form: LoginForm, login_data: LoginUser, } @@ -139,8 +140,8 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { Msg::UserReceived(user) }); } - Msg::UserReceived(user) => model.user = Some(user), - Msg::NotAuthenticated => {if model.user.is_some() {model.user = None; logout(orders)}}, + Msg::UserReceived(user) => model.user = Loadable::Data(Some(user)), + Msg::NotAuthenticated => {if model.user.is_some() {model.user = Loadable::Data(None); logout(orders)}}, Msg::Login => {login_user(model, orders)} Msg::UsernameChanged(s) => model.login_data.username = s, Msg::PasswordChanged(s) => model.login_data.password = s, @@ -238,7 +239,7 @@ impl<'a> Urls<'a> { fn view(model: &Model) -> Node { div![ C!["page"], - if let Some(user) = &model.user { + if let Some(ref user) = *model.user { div![ navigation::navigation(&model.i18n, &model.base_url, user), view_content(&model.page, &model.base_url) diff --git a/shared/src/datatypes.rs b/shared/src/datatypes.rs index 0ecff3d..84fbdf0 100644 --- a/shared/src/datatypes.rs +++ b/shared/src/datatypes.rs @@ -1,3 +1,5 @@ +use std::ops::Deref; + use serde::{Deserialize, Serialize, Serializer}; /// A generic list returntype containing the User and a Vec containing e.g. Links or Users #[derive(Clone, Deserialize, Serialize)] @@ -86,3 +88,20 @@ impl std::fmt::Display for Secret { f.write_str("*****SECRET*****") } } + +#[derive(Debug, Serialize, Deserialize)] +pub enum Loadable { + Data(Option), + Loading, +} + +impl Deref for Loadable{ + type Target = Option; + + fn deref(&self) -> &Self::Target { + match self { + Loadable::Data(t) => t, + Loadable::Loading => &None + } + } +}