LSFE/LSFE.MobApp/App.xaml.cs
2026-07-30 10:31:04 +08:00

171 lines
5.9 KiB
C#

using LSFE.MobApp.Services;
using System.Diagnostics;
namespace LSFE.MobApp
{
public partial class App : Application
{
private readonly Services.INavigationService _navigationService;
public App(IDatabaseService databaseService, INavigationService navigationService)
{
InitializeComponent();
_navigationService = navigationService;
// Initialize database in background
Task.Run(async () => await databaseService.InitializeAsync());
// Setup exception handlers
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
var exception = e.ExceptionObject as Exception;
var message = $"Unhandled exception: {exception?.GetType().Name}\n" +
$"Message: {exception?.Message}\n" +
$"Stack: {exception?.StackTrace}";
Debug.WriteLine(message);
LogToFile(message);
};
TaskScheduler.UnobservedTaskException += (s, e) =>
{
var message = $"Unobserved task exception: {e.Exception?.GetType().Name}\n" +
$"Message: {e.Exception?.Message}\n" +
$"Stack: {e.Exception?.StackTrace}\n" +
$"Inner: {e.Exception?.InnerException?.Message}";
Debug.WriteLine(message);
LogToFile(message);
e.SetObserved();
};
// Create and set MainPage
MainPage = new AppShell(_navigationService);
}
protected override Window CreateWindow(IActivationState? activationState)
{
var window = base.CreateWindow(activationState);
// Perform authentication check after window is created
window.Created += async (s, e) =>
{
await CheckAuthenticationAsync();
};
return window;
}
private async Task CheckAuthenticationAsync()
{
try
{
// Small delay to ensure Shell is fully initialized
await Task.Delay(50);
var token = await SecureStorage.GetAsync("auth_token");
if (string.IsNullOrEmpty(token) || token == "N/A")
{
// No valid token - navigate to login page
await MainThread.InvokeOnMainThreadAsync(async () =>
{
await Shell.Current.GoToAsync("//LoginPage");
});
}
else
{
// Has valid token - navigate to main tabs
await MainThread.InvokeOnMainThreadAsync(async () =>
{
await Shell.Current.GoToAsync("//MainTabs");
});
}
}
catch (Exception ex)
{
Debug.WriteLine($"Auth check error: {ex.Message}");
// On error, default to login page
await MainThread.InvokeOnMainThreadAsync(async () =>
{
try
{
await Shell.Current.GoToAsync("//LoginPage");
}
catch (Exception navEx)
{
Debug.WriteLine($"Navigation error: {navEx.Message}");
}
});
}
}
private void LogToFile(string message)
{
try
{
var logPath = Path.Combine(FileSystem.AppDataDirectory, "crash_log.txt");
var logMessage = $"\n{new string('=', 60)}\n{DateTime.Now:yyyy-MM-dd HH:mm:ss}\n{message}\n";
File.AppendAllText(logPath, logMessage);
}
catch (Exception ex)
{
Debug.WriteLine($"Failed to log to file: {ex.Message}");
}
}
}
}
/*using LSFE.MobApp.Services;
using System.Diagnostics;
namespace LSFE.MobApp
{
public partial class App : Application
{
public App(IDatabaseService databaseService)
{
InitializeComponent();
Task.Run(async () => await databaseService.InitializeAsync());
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
var exception = e.ExceptionObject as Exception;
var message = $"Unhandled exception: {exception?.GetType().Name}\n" +
$"Message: {exception?.Message}\n" +
$"Stack: {exception?.StackTrace}";
Debug.WriteLine(message);
LogToFile(message);
};
TaskScheduler.UnobservedTaskException += (s, e) =>
{
var message = $"Unobserved task exception: {e.Exception?.GetType().Name}\n" +
$"Message: {e.Exception?.Message}\n" +
$"Stack: {e.Exception?.StackTrace}\n" +
$"Inner: {e.Exception?.InnerException?.Message}";
Debug.WriteLine(message);
LogToFile(message);
e.SetObserved();
};
}
private void LogToFile(string message)
{
try
{
var logPath = Path.Combine(FileSystem.AppDataDirectory, "crash_log.txt");
var logMessage = $"\n{'=' * 60}\n{DateTime.Now:yyyy-MM-dd HH:mm:ss}\n{message}\n";
File.AppendAllText(logPath, logMessage);
}
catch (Exception ex)
{
Debug.WriteLine($"Failed to log to file: {ex.Message}");
}
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}
}*/