use crate::components::layout::protected::Protected; use crate::components::ui::skeleton::Skeleton; use crate::components::torrent::table::TorrentTable; use crate::components::auth::login::Login; use crate::components::auth::setup::Setup; use leptos::prelude::*; use leptos::task::spawn_local; use leptos_router::components::{Router, Routes, Route}; use leptos_router::hooks::{use_navigate, use_location}; use crate::components::ui::toast::Toaster; use crate::components::hooks::use_theme_mode::ThemeMode; #[component] pub fn App() -> impl IntoView { crate::components::ui::toast::provide_toaster(); let theme_mode = ThemeMode::init(); // Sync theme with document Effect::new(move |_| { let is_dark = theme_mode.get(); if let Some(doc) = document().document_element() { if is_dark { let _ = doc.class_list().add_1("dark"); let _ = doc.set_attribute("data-theme", "dark"); } else { let _ = doc.class_list().remove_1("dark"); let _ = doc.set_attribute("data-theme", "light"); } } }); view! { } } #[component] fn InnerApp() -> impl IntoView { crate::store::provide_torrent_store(); let store = use_context::(); let _loc = use_location(); let is_loading = signal(true); let is_authenticated = signal(false); let needs_setup = signal(false); Effect::new(move |_| { spawn_local(async move { log::info!("App initialization started..."); gloo_console::log!("APP INIT: Checking setup status..."); // Check if setup is needed via Server Function match shared::server_fns::auth::get_setup_status().await { Ok(status) => { if !status.completed { log::info!("Setup not completed"); needs_setup.1.set(true); is_loading.1.set(false); return; } } Err(e) => log::error!("Failed to get setup status: {:?}", e), } // Check authentication via GetUser Server Function match shared::server_fns::auth::get_user().await { Ok(Some(user_info)) => { log::info!("Authenticated as {}", user_info.username); if let Some(s) = store { s.user.set(Some(user_info.username)); } is_authenticated.1.set(true); } Ok(None) => { log::info!("Not authenticated"); } Err(e) => { log::error!("Auth check failed: {:?}", e); } } is_loading.1.set(false); crate::store::toast_success("VibeTorrent'e Hoşgeldiniz"); }); }); Effect::new(move |_| { if is_authenticated.0.get() { spawn_local(async { gloo_timers::future::TimeoutFuture::new(2000).await; if crate::utils::platform::supports_push_notifications() && !crate::utils::platform::is_safari() { crate::store::subscribe_to_push_notifications().await; } }); } }); view! {
"404 Not Found"
}> } } /> } } /> // Sidebar skeleton
// Main content skeleton
}.into_any() }>
}.into_any() }/>
"Settings Page (Coming Soon)"
} }/> } }