mod components; mod pages; use leptos::*; use leptos_meta::*; use leptos_router::*; use pages::{ auth::{ forgot::ForgotPage, login::LoginPage, logout::LogoutPage, register::RegisterPage, reset::ResetPage, }, dashboard::DashboardPage, error::{AppError, ErrorTemplate}, oauth2::authorize::AuthorizePage, }; use crate::domain::api::prelude::User; #[component] pub fn App() -> impl IntoView { provide_meta_context(); let trigger_update = create_rw_signal(false); let trigger_direct = create_rw_signal(None::); let user_signal = create_rw_signal(None::); let user_resource = create_local_resource(trigger_update, move |_| async move { let user = super::check_user().await.unwrap(); user_signal.set(user); }); view! { // https://fontawesome.com/v5/search <Router fallback=|| { let mut outside_errors = Errors::default(); outside_errors.insert_with_default_key(AppError::NotFound); view! { <ErrorTemplate outside_errors/> } .into_view() }> <main class="h-screen overflow-auto dark:base-100 dark:text-white"> <Routes> <Route path="auth" view=move || { view! { <Suspense> <Show when=move || user_resource().is_some_and(|_|user_signal().is_some())> <Redirect path={ trigger_direct().unwrap_or(String::from("/")) } /> </Show> </Suspense> <Outlet /> } }> <Route path="login" view=move || view! { <LoginPage trigger_signal=trigger_update direct_signal=trigger_direct /> } /> <Route path="register" view=RegisterPage /> <Route path="forgot" view=ForgotPage /> <Route path="reset/:token" view=ResetPage /> </Route> // auth <Route path="" view=move || { view! { <Suspense> <Show when=move || user_resource().is_some_and(|_|user_signal().is_none())> <Redirect path={ use base64::prelude::*; format!("/auth/login?c={}", BASE64_URL_SAFE_NO_PAD.encode(format!("{}{}", (leptos_router::use_location().pathname)(), (leptos_router::use_location().query)().to_query_string()))) } /> </Show> </Suspense> <Outlet /> } }> <Route path="" view=move || view! { <Suspense> <Show when=move || user_signal().is_some()> <DashboardPage user={ user_signal().unwrap() } /> </Show> </Suspense> } /> <Route path="oauth2/authorize" view=move || view! { <Suspense> <Show when=move || user_signal().is_some()> <AuthorizePage user={ user_signal } /> </Show> </Suspense> } /> </Route> // Logged in <Route path="auth/logout" view=move || view! { <LogoutPage trigger_signal=trigger_update user_signal /> } /> </Routes> </main> </Router> } }