The schedule screen was never loading data because no LaunchedEffect
called loadAccounts() when the user became authenticated. Now:
- App.kt: calls scheduleViewModel.loadAccounts() when authState becomes Authenticated
- ScheduleScreen.kt: calls loadCachedSchedule() when selectedAccount is set
- Add App.kt root composable with state-based routing
(Login -> Schedule -> EventDetail) driven by AuthViewModel.state
- Update MainActivity (Android), MainViewController (iOS), and
Main.kt (Desktop) to host App() with their platform OAuthClient
- Add iOS Xcode source files (MyIceApp.swift, ContentView.swift)
and Info.plist with myice:// URL scheme
- Delete Placeholder.kt
- Add kotlinx-coroutines-swing to desktopMain to provide
Dispatchers.Main for viewModelScope (app crashed on desktop
without it)
- AndroidOAuthClient: ACTION_VIEW + OAuthCallbackActivity (myice://callback)
- IosOAuthClient: ASWebAuthenticationSession with presentation context provider
- DesktopOAuthClient: local HTTP server + system browser
- AndroidManifest: register OAuthCallbackActivity intent filter
- Align Kotlin to 2.3.20 (required by Compose MP 1.11.1 klibs) and
compileSdk to 36 (required by activity-compose 1.13.0); fix missing
Text import and stray brace in placeholder iOS/Android entry points
Add ApiConfig, AuthTokenHolder singleton, expect/actual HttpClient
engine factories (CIO for Android/Desktop, Darwin for iOS), and
ApiService with four GET endpoints. Bearer token from AuthTokenHolder
is injected as Authorization header on each request.
Adjusted for Ktor 3.5.1: HttpClientEngineFactory lives in
io.ktor.client.engine; the timeout plugin is HttpTimeout (package
io.ktor.client.plugins), not HttpTimeoutPlugin. Tests wrap suspend
calls in runTest and assert request URLs without a trailing '?'.
10-task TDD plan covering: project scaffolding, data models, networking
(Ktor), caching, filtering logic, viewmodels, platform OAuth, UI theme
and components, screens, and app root with entry points for Android,
iOS, and Desktop.
Design for porting the MyIce Flutter app to Kotlin Multiplatform
(Android + iOS + Desktop) using Compose Multiplatform. Mirrors the
3-screen structure (Login, Schedule, Event Detail) and 4 GET endpoints
with Bearer auth via Infomaniak OIDC. Adds a type filter to surface
practices alongside games.