/
rorikstr
/
multiberry-frontend
Обзор
Документация
Войти
/
rorikstr
/
multiberry-frontend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
src/main.rs
84 строки
2 KB
Rorik Star Platinum
feat: login, logout, account after request
09 ноя 2025, 21:20
09 ноя 2025, 21:20
684fbd5
Код
Авторство
О чём код?
// src/main.rs use dioxus::prelude::*; // Когда мы объявляем модуль, все его экспортируемые макросы // становятся доступны в этом файле. Импорт не нужен. mod logger; mod views; mod api; // use crate::app_log; // <-- УДАЛЯЕМ ЭТУ СТРОКУ use views::{login::Login, accounts::Accounts}; #[derive(Clone, Copy)] struct AuthToken(Signal<Option<String>>); #[derive(Clone, Copy)] struct BankUserId(Signal<Option<String>>); #[derive(Debug, Clone, Routable, PartialEq)] #[rustfmt::skip] enum Route { #[layout(RouteGuard)] #[route("/")] Login {}, #[route("/accounts")] Accounts {}, } fn main() { dioxus::launch(App); } #[component] fn App() -> Element { let mut token = use_signal(|| None); let mut bank_user_id = use_signal(|| None); use_context_provider(|| AuthToken(token)); use_context_provider(|| BankUserId(bank_user_id)); use_effect(move || { // Макрос app_log! доступен здесь без `use` app_log!("App Mounted. Checking localStorage for session..."); if let Some(storage) = web_sys::window().and_then(|w| w.local_storage().ok()).flatten() { if let (Ok(Some(t)), Ok(Some(u))) = (storage.get_item("auth_token"), storage.get_item("bank_user_id")) { app_log!("Found token in localStorage, restoring session."); token.set(Some(t)); bank_user_id.set(Some(u)); } else { app_log!("No session found in localStorage."); } } }); rsx! { Router::<Route> {} } } #[component] fn RouteGuard() -> Element { let token = use_context::<AuthToken>(); let navigator = use_navigator(); let current_route: Route = use_route(); use_effect(move || { let route = current_route.clone(); app_log!("RouteGuard effect: Current route: {:?}, Token exists: {}", &route, token.0.read().is_some()); match (token.0.read().is_some(), route) { (true, Route::Login {}) => { app_log!("Redirecting from /login to /accounts"); navigator.replace(Route::Accounts {}); }, (false, route) if !matches!(route, Route::Login {}) => { app_log!("Redirecting from protected route to /login"); navigator.replace(Route::Login {}); }, _ => {} } }); rsx! { Outlet::<Route> {} } }