171 lines
5.9 KiB
C#
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());
|
|
}
|
|
}
|
|
}*/ |