semi working backend (it works but not really usable)
This commit is contained in:
+6
-1
@@ -1 +1,6 @@
|
||||
// use dioxus::prelude::*;
|
||||
use dioxus::prelude::*;
|
||||
|
||||
#[server]
|
||||
pub async fn log_in(username: String, password: String) -> Result<String, ServerFnError> {
|
||||
Ok(format!("{username}@{password}"))
|
||||
}
|
||||
|
||||
+45
-6
@@ -1,16 +1,48 @@
|
||||
use dioxus::prelude::*;
|
||||
|
||||
use crate::Route;
|
||||
use crate::{backend, utils};
|
||||
|
||||
const LOGIN_CSS: Asset = asset!("/assets/styles/login.css");
|
||||
|
||||
#[component]
|
||||
pub fn Login() -> Element {
|
||||
let username = use_signal(|| String::new());
|
||||
let password = use_signal(|| String::new());
|
||||
|
||||
let is_disabled = {
|
||||
let username = username.clone();
|
||||
let password = password.clone();
|
||||
move || username().is_empty() || password().is_empty()
|
||||
};
|
||||
|
||||
let log_in = {
|
||||
let username = username.clone();
|
||||
let password = password.clone();
|
||||
move || async move {
|
||||
if username().is_empty() || password().is_empty() {
|
||||
return;
|
||||
}
|
||||
match backend::log_in(username.read().clone(), password.read().clone()).await {
|
||||
Ok(id) => {
|
||||
utils::set_cookie("session_id", &id);
|
||||
utils::redirect("/dashboard");
|
||||
}
|
||||
Err(_) => {}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
rsx! {
|
||||
document::Link { rel: "stylesheet", href: LOGIN_CSS }
|
||||
|
||||
div {
|
||||
id: "login_wrapper",
|
||||
onkeypress: move |e: Event<KeyboardData>| async move {
|
||||
if e.key() == Key::Enter {
|
||||
log_in().await;
|
||||
}
|
||||
},
|
||||
tabindex: "0",
|
||||
|
||||
img {
|
||||
id: "background_img",
|
||||
@@ -23,16 +55,23 @@ pub fn Login() -> Element {
|
||||
|
||||
div {
|
||||
p { "Username" }
|
||||
input { class: "field" }
|
||||
input { onchange: {let mut username = username.clone(); move |e: Event<FormData>| {username.set(e.value())}}, class: "field" }
|
||||
}
|
||||
div{
|
||||
p { "Password" }
|
||||
input { class: "field" }
|
||||
input {
|
||||
class: "field",
|
||||
onchange: {
|
||||
let mut password = password.clone();
|
||||
move |e: Event<FormData>| {password.set(e.value())}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Link {
|
||||
to: Route::Dashboard { },
|
||||
button { "Login" }
|
||||
button {
|
||||
disabled: is_disabled(),
|
||||
onclick: move |_| log_in(),
|
||||
"Login"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
mod backend;
|
||||
mod components;
|
||||
mod cookie;
|
||||
mod dashboard;
|
||||
mod login;
|
||||
mod settings;
|
||||
mod utils;
|
||||
|
||||
use dioxus::prelude::*;
|
||||
use web_sys::window;
|
||||
@@ -38,7 +38,7 @@ fn App() -> Element {
|
||||
use_effect({
|
||||
let mut theme = theme.clone();
|
||||
move || {
|
||||
theme.set(cookie::get_cookie("theme").unwrap_or_default());
|
||||
theme.set(utils::get_cookie("theme").unwrap_or_default());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
use dioxus::prelude::*;
|
||||
|
||||
use crate::{components::sidebar::SideBar, cookie};
|
||||
use crate::{components::sidebar::SideBar, utils};
|
||||
|
||||
pub enum Property {
|
||||
Dropdown(&'static [&'static str]),
|
||||
@@ -44,10 +44,10 @@ pub fn Settings() -> Element {
|
||||
}
|
||||
div {
|
||||
id: "{name}",
|
||||
class: "dropdown",
|
||||
class: "dropdown dropdown-none",
|
||||
for o in opts {
|
||||
button { onclick: move |_| {
|
||||
cookie::set_cookie(name, &o);
|
||||
utils::set_cookie(name, &o);
|
||||
if *needs_refresh {
|
||||
if let Some(win) = web_sys::window() {
|
||||
win.location().reload().unwrap();
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use dioxus::prelude::use_navigator;
|
||||
use wasm_bindgen::JsCast;
|
||||
use web_sys::{window, HtmlDocument};
|
||||
|
||||
@@ -35,3 +36,7 @@ pub fn get_cookie(name: &str) -> Option<String> {
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
pub fn redirect(target: &str) {
|
||||
use_navigator().push(target);
|
||||
}
|
||||
Reference in New Issue
Block a user