FrymasterBadgeApp/Documentation/AppShellCS.md

60 lines
2.5 KiB
Markdown

# AppShell
**Namespace:** `FrymasterBadgeApp`
**Base Class:** `Shell`
**Purpose:** MAUI Shell container responsible for dynamic tab generation, routing, theme switching, and app-level navigation.
## 🔑 Fields
| Name | Type | Access | Description |
|------|------|--------|-------------|
| `_db` | `SqlService` | `private readonly` | Database service. |
| `_printerService` | `PrinterService` | `private readonly` | Printing service. |
| `_serviceProvider` | `IServiceProvider` | `private readonly` | DI container for resolving pages. |
| `_isInitialized` | `bool` | `private` | Prevents duplicate company loading. |
## 🛠 Constructor
### `AppShell(SqlService db, PrinterService printerService, IServiceProvider serviceProvider)`
- **Access:** `public`
- **Behavior:** Registers routes for `SettingsPage`, `CompanyPage`, and `EmployeePage`.
## 📦 Methods
### `OnAppearing()`
- **Access:** `protected override async void`
- **Behavior:** Ensures `LoadCompaniesAsync()` runs exactly once when shell becomes visible.
### `LoadCompaniesAsync()`
- **Access:** `private async Task`
- **Behavior:**
1. Fetches companies on background thread via `Task.Run`.
2. Switches to main thread to clear `MainTabBar.Items`.
3. If no companies: adds `"Setup"` tab routing to `CompanyPage`.
4. Else: adds `ShellContent` tab per company routing to `EmployeePage_{ID}`.
5. Navigates to first tab using `///{targetRoute}` (rebuilds stack).
6. Falls back to `///InitialSetup` on DB failure.
### `OnManageCompaniesClicked(object sender, EventArgs e)`
- **Access:** `public async void`
- **Behavior:** Pushes `CompanyPage` onto navigation stack.
### `OnSettingsClicked(object sender, EventArgs e)`
- **Access:** `private async void`
- **Behavior:** Pushes `SettingsPage` onto stack.
### `OnThemeClicked(object sender, EventArgs e)`
- **Access:** `private async void`
- **Behavior:** Displays action sheet (`System`, `Light`, `Dark`). Updates `Application.Current.UserAppTheme` and persists to `Preferences.Default`.
### `OnExitClicked(object sender, EventArgs e)`
- **Access:** `private`
- **Behavior:** Calls `Application.Current?.Quit()`.
### `OnAboutClicked(object sender, EventArgs e)`
- **Access:** `private async void`
- **Behavior:** Displays alert: `"Frymaster Badge App v1.0"`.
---
**Architecture Notes:**
- Uses `///` route prefix to force full navigation stack rebuild when switching initial tabs.
- Thread-safe UI updates via `MainThread.InvokeOnMainThreadAsync`.
- Graceful degradation to setup screen on database failure.