using CORP_MAUI.Pages; using CORP_MAUI.Models; using CORP_MAUI.Services; using System.Diagnostics; namespace CORP_MAUI; public partial class App : Application { public App() { Trace.WriteLine("╔═════════════════════════════════════════════════════════════════════════════════╗"); Trace.WriteLine("║ [App] APPLICATION CONSTRUCTOR STARTED ║"); Trace.WriteLine("╚═════════════════════════════════════════════════════════════════════════════════╝"); #if DEBUG Trace.WriteLine("[App] ✅ DEBUG MODE IS ACTIVE!"); #else Trace.WriteLine("[App] ⚠️ DEBUG MODE IS NOT ACTIVE!"); #endif InitializeComponent(); // Очищаем устаревший кэш изображений ImageCacheService.Instance.CleanExpiredCache(); Trace.WriteLine("[App] ✅ Application initialized"); } protected override Window CreateWindow(IActivationState? activationState) { Trace.WriteLine("[App] >>> CreateWindow called"); // Создаем окно с начальной страницей загрузки #if ANDROID || IOS || MACCATALYST || WINDOWS ContentPage loadingPage = new ContentPage { Content = new VerticalStackLayout { VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center, Spacing = 20, Children = { new ActivityIndicator { IsRunning = true, Color = Colors.Blue }, new Label { Text = "Загрузка...", HorizontalOptions = LayoutOptions.Center } } } }; Window window = new Window(loadingPage); #else // Фолбэк для платформ вне целевых (не должен использоваться в текущих TFM) Window window = new Window(); #endif // Асинхронно проверяем токен и определяем начальную страницу _ = InitializeAppAsync(window); return window; } private async Task InitializeAppAsync(Window window) { try { await CheckAuthenticationAndNavigate(window); } catch (Exception ex) { Trace.WriteLine($"[App] ❌ FATAL: InitializeAppAsync failed: {ex.Message}"); Trace.WriteLine($"[App] Exception type: {ex.GetType().Name}"); Trace.WriteLine($"[App] Stack trace: {ex.StackTrace}"); await MainThread.InvokeOnMainThreadAsync(() => { window.Page = new NavigationPage(new LoginPage()); }); } } private async Task CheckAuthenticationAndNavigate(Window window) { try { Trace.WriteLine("[App] >>> Checking authentication status..."); // Пытаемся получить данные текущего пользователя // Это автоматически загрузит токены из SecureStorage и проверит их валидность User? user = null; try { user = await ServiceProvider.ApiService.GetCurrentUserAsync(); } catch (Exception userEx) { Trace.WriteLine($"[App] ⚠️ GetCurrentUserAsync failed: {userEx.Message}"); // Если не удалось получить пользователя, значит токен невалиден или отсутствует user = null; } if (user != null) { // ✅ Токен валиден, пользователь авторизован Trace.WriteLine($"[App] ✅ User authenticated: {user.Username} (ID: {user.Id})"); Trace.WriteLine($"[App] Email: {user.Email}"); // Подключаемся к WebSocket try { Trace.WriteLine("[App] >>> Connecting to WebSocket..."); string? token = ServiceProvider.ApiService.GetAccessToken(); if (!string.IsNullOrEmpty(token)) { await ServiceProvider.WebSocketService.ConnectAsync(token); Trace.WriteLine("[App] ✅ WebSocket connected successfully"); } else { Trace.WriteLine("[App] ⚠️ No access token available for WebSocket"); } } catch (Exception wsEx) { Trace.WriteLine($"[App] ⚠️ WebSocket connection failed: {wsEx.Message}"); // Продолжаем работу без WebSocket - это не критично } // Переходим сразу на главную страницу // На Windows/Desktop используем DesktopMainPage, на мобильных - AppShell Trace.WriteLine("[App] >>> Navigating to main page"); await MainThread.InvokeOnMainThreadAsync(() => { #if WINDOWS || MACCATALYST // На десктопе проверяем ширину экрана double screenWidth = DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density; Trace.WriteLine($"[App] Screen width: {screenWidth}"); if (screenWidth >= 768) { window.Page = new DesktopMainPage(); Trace.WriteLine("[App] ✅ Navigation to DesktopMainPage completed"); } else { window.Page = new AppShell(); Trace.WriteLine("[App] ✅ Navigation to AppShell completed"); } #else window.Page = new AppShell(); Trace.WriteLine("[App] ✅ Navigation to AppShell completed"); #endif }); } else { // ❌ Токен отсутствует или невалиден, показываем страницу входа Trace.WriteLine("[App] ℹ️ No valid authentication found"); Trace.WriteLine("[App] >>> Showing LoginPage"); await MainThread.InvokeOnMainThreadAsync(() => { window.Page = new NavigationPage(new LoginPage()); Trace.WriteLine("[App] ✅ Navigation to LoginPage completed"); }); } } catch (Exception ex) { Trace.WriteLine($"[App] ❌ Authentication check failed: {ex.Message}"); Trace.WriteLine($"[App] Exception type: {ex.GetType().Name}"); Trace.WriteLine($"[App] >>> Fallback to LoginPage"); await MainThread.InvokeOnMainThreadAsync(() => { window.Page = new NavigationPage(new LoginPage()); }); } } }