ft/adds local storage functionality

This commit is contained in:
itsscb 2024-04-25 22:25:28 +02:00
parent b5968c6905
commit 566a95b5d7
10 changed files with 66 additions and 6 deletions

View File

@ -7,6 +7,9 @@ edition = "2021"
[dependencies] [dependencies]
web-sys = {version="0.3.69", features = ["HtmlInputElement"]} web-sys = {version="0.3.69", features = ["HtmlInputElement"]}
yew = { git = "https://github.com/yewstack/yew/", features = ["csr"] } yew = { version = "0.21.0", features = ["csr"] }
yew-router = { git = "https://github.com/yewstack/yew.git" } yew-router = { version = "0.18.0"}
gloo-console = "0.3.0" gloo-console = "0.3.0"
yewdux = "0.10.0"
serde = "1.0.198"
serde_json = "1.0.116"

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

2
dist/index.html vendored
View File

@ -1 +1 @@
<!doctype html><html lang=en><meta charset=UTF-8><meta content="width=device-width,initial-scale=1" name=viewport><title>Digitaler Frieden</title><link href=/styles-5591055ecd987932.css integrity=sha384-a1WEqxtAH6YUfKJ4yrHqkgiTWmHSE42XmyBtxbyCY/WaCq4Is/iVWx0Q1jgF3cVf rel=stylesheet><link href=/favicon-928ba63f33046eed.ico integrity=sha384-Neq57jnFrTfqAN1JvKAVVVcH1EW3//cZHmK2NRXRlNrxAZR6ErTvXzbOLSyHzkA4 rel=icon><link href=public/manifest.json rel=manifest><link as=fetch crossorigin href=/digitaler-frieden-795e1f8302791ee3_bg.wasm integrity=sha384-A3uAtAsxCCKmIP7Da07uuP8bTVVReLXUYbouhrjjMFqCkDOlNk6i6g6Wj+/vOXen rel=preload type=application/wasm><link crossorigin href=/digitaler-frieden-795e1f8302791ee3.js integrity=sha384-N4IsPzEVpnyqMI4scOD/c9Kl6gIagEOAbcIBYDcEKmdgixw7jwKdvjNI8/4mlz1v rel=modulepreload></head><body class="bg-black text-white"><script type=module>import a,*as b from"/digitaler-frieden-795e1f8302791ee3.js";a(`/digitaler-frieden-795e1f8302791ee3_bg.wasm`);window.wasmBindings=b</script></body></html> <!doctype html><html lang=en><meta charset=UTF-8><meta content="width=device-width,initial-scale=1" name=viewport><title>Digitaler Frieden</title><link href=/styles-5591055ecd987932.css integrity=sha384-a1WEqxtAH6YUfKJ4yrHqkgiTWmHSE42XmyBtxbyCY/WaCq4Is/iVWx0Q1jgF3cVf rel=stylesheet><link href=/favicon-928ba63f33046eed.ico integrity=sha384-Neq57jnFrTfqAN1JvKAVVVcH1EW3//cZHmK2NRXRlNrxAZR6ErTvXzbOLSyHzkA4 rel=icon><link href=public/manifest.json rel=manifest><link as=fetch crossorigin href=/digitaler-frieden-eab7a54548d51de2_bg.wasm integrity=sha384-yIgdjjA54X2bCfznoV2thson0zMX/fylXo3m3P6SQUskENlvhwzInFeXgmspjxws rel=preload type=application/wasm><link crossorigin href=/digitaler-frieden-eab7a54548d51de2.js integrity=sha384-Cv8tsSgrMidET9utI0GS5mGbbYqFPiVDuqpIdmg3Xx2gn3M6iEcvr2b5TuuW93cS rel=modulepreload></head><body class="bg-black text-white"><script type=module>import a,*as b from"/digitaler-frieden-eab7a54548d51de2.js";a(`/digitaler-frieden-eab7a54548d51de2_bg.wasm`);window.wasmBindings=b</script></body></html>

View File

@ -1,2 +1,3 @@
pub mod pages; pub mod pages;
pub mod router; pub mod router;
pub mod storage;

View File

@ -1,10 +1,15 @@
use crate::router::Route; use crate::{
router::Route,
storage::{self, UserData},
};
use web_sys::HtmlInputElement; use web_sys::HtmlInputElement;
use yew::{classes, function_component, html, Html}; use yew::{classes, function_component, html, Html};
use yew_router::components::Link; use yew_router::components::Link;
#[function_component] #[function_component]
pub fn SignUp() -> Html { pub fn SignUp() -> Html {
let (_, dispatch) = yewdux::use_store::<UserData>();
let register = yew::functional::use_state(|| true); let register = yew::functional::use_state(|| true);
let reg = register.clone(); let reg = register.clone();
let reg_onchange = yew::Callback::from(move |_| { let reg_onchange = yew::Callback::from(move |_| {
@ -26,10 +31,13 @@ pub fn SignUp() -> Html {
let email: yew::NodeRef = yew::NodeRef::default(); let email: yew::NodeRef = yew::NodeRef::default();
let mail = email.clone(); let mail = email.clone();
let onchange = yew::Callback::from(move |_| { let onchange = yew::Callback::from(move |_| {
let dispatch = dispatch.clone();
if let Some(m) = mail.cast::<HtmlInputElement>() { if let Some(m) = mail.cast::<HtmlInputElement>() {
// TODO: Remove as soon as the Logic is implemented. // TODO: Remove as soon as the Logic is implemented.
gloo_console::log!(format!("E-Mail: {}", m.value())); gloo_console::log!(format!("E-Mail: {}", m.value()));
if !m.value().is_empty() { if !m.value().is_empty() {
storage::set_email_address(dispatch, Some(m.value()));
mc.set(false); mc.set(false);
} else { } else {
mc.set(true); mc.set(true);

View File

@ -2,9 +2,14 @@ use yew::{classes, function_component, html, Html};
use yew_router::components::Link; use yew_router::components::Link;
use crate::router::Route; use crate::router::Route;
use crate::storage;
#[function_component] #[function_component]
pub fn Verify() -> Html { pub fn Verify() -> Html {
let (state, _) = yewdux::use_store::<storage::UserData>();
let resend_onclick = yew::Callback::from(move |_| {
gloo_console::log!(format!("Resending E-Mail to '{:?}'", state.email_address()));
});
html! { html! {
<div class="flex flex-col justify-center items-center h-full space-y-16 px-8 m-0"> <div class="flex flex-col justify-center items-center h-full space-y-16 px-8 m-0">
<section id="navigation" class="mb-2 md:mb-12 lg:mb-0"> <section id="navigation" class="mb-2 md:mb-12 lg:mb-0">
@ -107,7 +112,8 @@ pub fn Verify() -> Html {
transition duration-150 transition duration-150
" "
> >
<Link<Route> to={Route::SignUp}>{ "Erneut senden" }</Link<Route>> <button onclick={resend_onclick}>{ "Erneut senden" }</button>
//<Link<Route> to={Route::SignUp}>{ "Erneut senden" }</Link<Route>>
</div> </div>
</div> </div>
</div> </div>

42
src/storage.rs Normal file
View File

@ -0,0 +1,42 @@
use serde::{Deserialize, Serialize};
use yewdux::Store;
#[derive(Debug, Default, Clone, PartialEq, Store, Serialize, Deserialize)]
#[store(storage = "local")]
pub struct UserData {
id: Option<String>,
email_address: Option<String>,
token: Option<String>,
}
impl UserData {
pub fn email_address(&self) -> Option<String> {
self.email_address.clone()
}
pub fn id(&self) -> Option<String> {
self.id.clone()
}
pub fn token(&self) -> Option<String> {
self.token.clone()
}
}
pub fn set_email_address(dispatch: yewdux::Dispatch<UserData>, email_address: Option<String>) {
dispatch.reduce_mut(move |store| {
store.email_address = email_address;
})
}
pub fn set_token(dispatch: yewdux::Dispatch<UserData>, token: Option<String>) {
dispatch.reduce_mut(move |store| {
store.token = token;
})
}
pub fn set_id(dispatch: yewdux::Dispatch<UserData>, id: Option<String>) {
dispatch.reduce_mut(move |store| {
store.id = id;
})
}