This commit is contained in:
2025-07-12 17:34:21 +02:00
parent 205bcabf5a
commit 5711f84172
5 changed files with 192 additions and 36 deletions
+1 -1
View File
@@ -19,7 +19,7 @@ const SIDEBAR_ITEMS: &[SideBarItem] = &[
SideBarItem {
name: "Settings",
icon: || rsx!(lucide_dioxus::Settings { size: 35 }),
route: Route::Dashboard {},
route: Route::Settings {},
},
];
+5 -13
View File
@@ -3,12 +3,14 @@ mod components;
mod cookie;
mod dashboard;
mod login;
mod settings;
use dioxus::prelude::*;
use web_sys::window;
use dashboard::Dashboard;
use login::Login;
use settings::Settings;
#[derive(Debug, Clone, Routable, PartialEq)]
#[rustfmt::skip]
@@ -17,6 +19,8 @@ enum Route {
Login {},
#[route("/dashboard")]
Dashboard {},
#[route("/settings")]
Settings {},
}
const FAVICON: Asset = asset!("/assets/favicon.ico");
@@ -29,7 +33,7 @@ fn main() {
#[component]
fn App() -> Element {
let mut theme = use_signal(|| String::from("light"));
let theme = use_signal(|| String::from("light"));
use_effect({
let mut theme = theme.clone();
@@ -53,18 +57,6 @@ fn App() -> Element {
document::Link { rel: "icon", href: FAVICON }
document::Link { rel: "stylesheet", href: FONT_CSS }
document::Link { rel: "stylesheet", href: THEME_CSS }
button {
onclick: move |_| {
let d = match theme.read().as_str() {
"dark" => String::from("black"),
"black" => String::from("light"),
_ => String::from("dark")
};
cookie::set_cookie("theme", &d);
theme.set(d);
},
"Click"
}
Router::<Route> { }
}
}
+68
View File
@@ -0,0 +1,68 @@
use dioxus::prelude::*;
use crate::{components::sidebar::SideBar, cookie};
pub enum Property {
Dropdown(&'static [&'static str]),
}
const SETTINGS_CSS: Asset = asset!("/assets/styles/settings.css");
const OPTIONS: &[(&str, Property, bool)] = &[(
"theme",
Property::Dropdown(&["light", "dark", "black"]),
true,
)];
#[component]
pub fn Settings() -> Element {
rsx! {
document::Link { rel: "stylesheet", href: SETTINGS_CSS }
div { class: "sidebar-container",
SideBar { selected: 1 }
div { class: "settings-container",
div {
for (name, prop, needs_refresh) in OPTIONS {
match prop {
Property::Dropdown(opts) => {
rsx!{
div { class: "dropdown-wrapper",
button { class: "dropdown-button", onclick: |_| {
let Some(document) = web_sys::window().and_then(|w| w.document()) else {
return;
};
let e = document.get_element_by_id(name).unwrap();
if e.class_name() == "dropdown" {
e.set_class_name("dropdown dropdown-none");
} else {
e.set_class_name("dropdown");
}
},
"{name}"
lucide_dioxus::ChevronDown { size: 16, class: "chevron", color: "currentColor" }
}
div {
id: "{name}",
class: "dropdown",
for o in opts {
button { onclick: move |_| {
cookie::set_cookie(name, &o);
if *needs_refresh {
if let Some(win) = web_sys::window() {
win.location().reload().unwrap();
}
}
}, "{o}" }
}
}
}
}
}
}
}
}
}
}
}
}