# KC-App client (Flutter) Single Flutter codebase for the KC-App platform. **Web** is the only target enabled so far (`flutter config --enable-web`); Android/iOS/desktop can be added later with `flutter create --platforms=...` in this directory — the `lib/` code is platform-agnostic. ## Run ```bash flutter pub get flutter run -d chrome --dart-define=API_BASE=http://localhost:3000/api ``` `API_BASE` defaults to `http://localhost:3000/api` (the local NestJS backend, which also serves the interim plain-HTML client at `/`). ## What's implemented - **Login** (`lib/screens/login_screen.dart`) — three tabs: - *Konfi / Gast*: KC invite code + first/last name → `POST /auth/guest`. - *Team-Login*: email + password for local Gemeinde Teamer → `POST /auth/team-login`. (Leitungsteam / Verantwortliche use the Authentik Authorization-Code flow, not yet wired into this client.) - *Einladung*: redeem a Teamer invite token → `POST /auth/teamer/register`. - The token is stored via `shared_preferences` (localStorage on web) and restored on start; `GET /auth/me` resolves the role for a role-aware home. - **Home** (`lib/screens/home_screen.dart`) — identity card + navigation. - **Workshop-Wahl** (`lib/screens/wahl_screen.dart`, guests) — loads `GET /wahl/guest/overview`, tap workshops in order (max 3) to set priorities, `POST /wahl/:id/teilnehmer`. - **Dateien** (`lib/screens/files_screen.dart`) — `GET /files/:kcId`, filtered server-side by the caller's visibility tier. - **Chat** (`lib/screens/chat_screen.dart`) — channel + message list (read-only; sending is a WebSocket path, still to do). ## Architecture - `lib/api.dart` — `Api` (thin REST wrapper + models) and `AppState` (`ChangeNotifier`: session, login/logout, token persistence). - `lib/main.dart` — `AppScope` (an `InheritedNotifier`) exposes `AppScope.of(context)`; `_AuthGate` switches Login/Home. No third-party state-management package.