corp-app/CORP-MAUI/App.xaml.cs

191 lines
7.8 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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());
});
}
}
}