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