191 lines
7.8 KiB
C#
191 lines
7.8 KiB
C#
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());
|
||
});
|
||
}
|
||
}
|
||
}
|