use dioxus::prelude::*; use crate::dioxus_fullstack::FullstackContext; use tracing::Level; pub mod config; use crate::components::toast::ToastProvider; use crate::views::{ Upload, UploadInfo, Home, NotFound }; #[cfg(feature = "server")] use crate::config::ServerConfig; mod components; mod views; #[derive(Debug, Clone, Routable, PartialEq)] #[rustfmt::skip] enum Route { #[layout(ErrorLayout)] #[route("/")] Home { }, #[route("/upload/:file")] UploadInfo { file: String }, #[route("/upload")] Upload { }, #[route("/:..route")] NotFound { route: Vec }, } const FAVICON: Asset = asset!("/assets/favicon.ico"); const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); fn main() { #[cfg(feature = "server")] let _ = ServerConfig::load(); dioxus::logger::init(Level::INFO).expect("failed to init logger"); dioxus::launch(App); } #[component] fn ErrorLayout() -> Element { rsx! { ErrorBoundary { handle_error: move |err: ErrorContext| { let http_error = FullstackContext::commit_error_status(err.error().unwrap()); match http_error.status { StatusCode::NOT_FOUND => rsx! { div { "404 - Page not found" } }, _ => rsx! { div { "An unknown error occurred" } }, } }, Outlet:: {} } } } #[component] fn App() -> Element { rsx! { document::Link { rel: "icon", href: FAVICON } document::Link { rel: "stylesheet", href: TAILWIND_CSS } div { class: "h-screen w-screen bg-zinc-900 text-white", ToastProvider { Router:: {} } } } }