Plan + client README updated for the guest Wahl result endpoint/tab, the WebSocket chat wiring, and the ChatGateway caller-promise fix. Section 8 now scopes the remaining Flutter work to the Authentik-dependent screens. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
46 lines
2.1 KiB
Markdown
46 lines
2.1 KiB
Markdown
# 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) — two tabs:
|
|
*Wünsche* (`GET /wahl/guest/overview`, tap workshops in order, max 3,
|
|
`POST /wahl/:id/teilnehmer`) and *Ergebnis* (`GET /wahl/guest/results` —
|
|
PENDING / ASSIGNED with workshop + wish rank / UNASSIGNED).
|
|
- **Dateien** (`lib/screens/files_screen.dart`) — `GET /files/:kcId`,
|
|
filtered server-side by the caller's visibility tier.
|
|
- **Chat** (`lib/screens/chat_screen.dart` + `lib/chat_socket.dart`) —
|
|
channel list, REST history, then a live `/chat` WebSocket connection
|
|
(`chat:join` / `chat:send` / `chat:message`) with a compose bar.
|
|
|
|
## Architecture
|
|
|
|
- `lib/api.dart` — `Api` (thin REST wrapper + models) and `AppState`
|
|
(`ChangeNotifier`: session, login/logout, token persistence).
|
|
- `lib/main.dart` — `AppScope` (an `InheritedNotifier<AppState>`) exposes
|
|
`AppScope.of(context)`; `_AuthGate` switches Login/Home. No third-party
|
|
state-management package.
|