Enable Dioxus 0.7 automatic WASM bundle splitting by route: - Add wasm-split feature to dioxus and dioxus-router in Cargo.toml - Add --wasm-split flag to dx build in Makefile - Router definitions stay as plain #[route] — splitting is automatic Dioxus 0.7.9 handles splitting automatically when the feature and CLI flag are enabled. Per-route #[wasm_split] attributes are not required (and not supported by this version's derive macro).
80 lines
2.1 KiB
Rust
80 lines
2.1 KiB
Rust
use dioxus::prelude::*;
|
|
use std::sync::Arc;
|
|
|
|
use crate::components::admin_layout::AdminLayout;
|
|
use crate::components::frontend_layout::FrontendLayout;
|
|
use crate::context::UserContext;
|
|
use crate::pages::about::About;
|
|
use crate::pages::admin::{Admin, Posts, Write};
|
|
use crate::pages::archives::Archives;
|
|
use crate::pages::home::{Home, HomePage};
|
|
use crate::pages::login::Login;
|
|
use crate::pages::post_detail::PostDetail;
|
|
use crate::pages::register::Register;
|
|
use crate::pages::search::Search;
|
|
use crate::pages::tags::{TagDetail, Tags};
|
|
use crate::theme::{use_theme_provider, Theme, ThemePreload};
|
|
|
|
#[derive(Clone, Routable, Debug, PartialEq)]
|
|
#[rustfmt::skip]
|
|
pub enum Route {
|
|
#[layout(FrontendLayout)]
|
|
#[route("/")]
|
|
Home {},
|
|
#[route("/page/:page")]
|
|
HomePage { page: i32 },
|
|
#[route("/archives")]
|
|
Archives {},
|
|
#[route("/tags")]
|
|
Tags {},
|
|
#[route("/tags/:tag")]
|
|
TagDetail { tag: String },
|
|
#[route("/post/:slug")]
|
|
PostDetail { slug: String },
|
|
#[route("/search")]
|
|
Search {},
|
|
#[route("/about")]
|
|
About {},
|
|
#[end_layout]
|
|
|
|
#[nest("/admin")]
|
|
#[layout(AdminLayout)]
|
|
#[route("/")]
|
|
Admin {},
|
|
#[route("/write")]
|
|
Write {},
|
|
#[route("/posts")]
|
|
Posts {},
|
|
#[end_layout]
|
|
#[end_nest]
|
|
|
|
#[route("/login")]
|
|
Login {},
|
|
#[route("/register")]
|
|
Register {},
|
|
}
|
|
|
|
#[component]
|
|
pub fn AppRouter() -> Element {
|
|
let theme = use_theme_provider();
|
|
let theme_class = match theme() {
|
|
Theme::Dark => "dark",
|
|
Theme::Light => "",
|
|
};
|
|
|
|
let user = use_signal(|| None::<Arc<crate::models::user::PublicUser>>);
|
|
let checked = use_signal(|| false);
|
|
use_context_provider(|| UserContext { user, checked });
|
|
|
|
rsx! {
|
|
document::Stylesheet { href: "/style.css" }
|
|
document::Stylesheet { href: "/highlight.css" }
|
|
document::Title { "Yggdrasil Blog" }
|
|
div {
|
|
class: "{theme_class}",
|
|
ThemePreload {}
|
|
Router::<Route> {}
|
|
}
|
|
}
|
|
}
|