Files
recipe-app/next_steps_flutter.md
T
2026-04-22 21:31:25 +02:00

195 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Next Steps: Flutter-migrering
Relaterade dokument:
- [flutter/README.md](flutter/README.md)
- [teknisk_beskrivning_flutter.md](teknisk_beskrivning_flutter.md)
- [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md)
## Icke-forhandlingsbara ramar
1. Inget ska tas bort eller andras i `recipe-api` utom explicit beslutade backend-andringar for anvandarscope i pantry och matplan.
2. Inget ska tas bort eller andras i `recipe-frontend`.
3. Migreringen sker i Flutter-sparet som separat klient mot befintliga API-kontrakt.
4. Next-frontend kor parallellt tills Flutter har verifierad parity i karnfloden.
## Beslut 2026-04-22 - User-scope for pantry och matplan
- Pantry och matplan ska vara per anvandare, inte globala.
- Detta kraver backend-andringar i `recipe-api` innan Flutter kan na full parity for dessa floden.
- Flutter ska folja de nya kontrakten nar de finns pa plats, utan klientspecifik speciallogik.
## Malbild for v1 (funktionell parity)
For v1 ska dessa floden vara stabila i Flutter:
- Auth: login, session, logout, auth-guard.
- Recept: lista, detalj, skapa, uppdatera, ta bort.
- Inventarie: lista, skapa, uppdatera, konsumera, historik.
- Matplan: veckovy, val av recept per dag, portionsjustering, inkopslista, inventariejamforelse.
- Import: quick-import + parse-markdown-flode.
- Profil: basfunktioner for anvandarprofil.
Adminfloden migreras efter att ovanstaende ar verifierat.
## Prioriterad plan (ordning)
## Fas 0 - Backend-forarbete for user-scope (KLAR 2026-04-22)
- [x] Gor `PantryItem` user-scopad (userId + productId unik per anvandare).
- [x] Gor matplan user-scopad och filtrera list/upsert/delete per inloggad anvandare.
- [x] Uppdatera matplanens inventory-jamforelse till anvandarspecifikt pantry.
- [x] Publicera uppdaterade API-kontrakt innan vidare Flutter-parity for matplan/baslager.
- [x] Migration 20260422130000_user_scope_pantry_meal_plan applicerad.
## Fas 1 - Stabil app-shell (KLAR 2026-04-22)
- [x] Bygg tydlig auth-gate i router.
- [x] Centralisera API-fel (401/403/500) i ett gemensamt lager (`mapErrorToUserMessage`).
- [x] Skapa gemensamma UI-komponenter for loading, empty, error.
- [x] Satt en enhetlig navigationsstruktur (web forst, mobil-redo).
- [x] Lokalisering: ARB-infrastruktur pa plats (`flutter_localizations`, `l10n.yaml`, `app_sv.arb`, `synthetic-package: false`, `flutter gen-l10n` i Dockerfile).
- [x] Regressionstest for svenska strangkvalitet tillagd.
## Fas 2 - Auth parity (KLAR 2026-04-22)
- [x] Hardna loginflodet (tydliga felmeddelanden, retries dar relevant).
- [x] Verifiera token-livscykel (reload/hard refresh/logout).
- [x] Implementera automatisk hantering av utgangen token (401 -> logout -> login).
## Fas 3 - Recept parity (KLAR 2026-04-22)
- [x] Lista -> detalj -> skapa -> redigera -> ta bort.
- [x] Knyt ihop med parse-markdown-proxy.
- [x] Behall backend som enda plats for matchning, validering och affarslogik.
## Fas 4 - Inventarie parity (KLAR 2026-04-22)
- [x] Lista med filter/sortering (plats + sort via Riverpod-querystate).
- [x] Skapa och uppdatera inventariepost.
- [x] Konsumtion och konsumtionshistorik.
## Fas 5 - Matplan parity (KLAR 2026-04-22)
- [x] Veckovy med receptval per dag mot user-scopat `GET /api/meal-plan?from=&to=`.
- [x] Portionsjustering per dag.
- [x] Inkoplista och inventariejamforelse mot anvandarens pantry.
## UI/UX-förbättringar (KLAR 2026-04-22)
- [x] Produktval med bottenark (ProductPickerField) i inventarie/pantry.
- [x] Swipe-för-±1 på inventarielistan (SwipeableInventoryTile med visuell ledtråd).
## Fas 6 - Import parity
### Analys (2026-04-22)
**Två separata flöden — samma skärm med flikar:**
#### 6a — Recept-import
- Endpoint: `POST /api/quick-import`
- Lägen: (1) filuppladdning med `multipart/form-data`, fält `file`, max 10 MB,
accepterade typer: PDF, PNG, JPG, JPEG, WEBP, BMP;
(2) URL via JSON-body `{ input: string }`.
- Svar: `{ markdown: string, source: 'ica'|'pdf'|'image'|'other', imageUrl?: string }`.
- På lyckat resultat: navigera till `/recipes/create` med markdown-texten förifylld.
- **Kräver**: `CreateRecipeScreen` måste utökas med en valfri `initialMarkdown`-parameter
som skickas via GoRouter `extra` (undviker persistent state-provider för tillfällig data).
#### 6b — Kvitto-import
- Endpoint: `POST /api/receipt-import`
- Läge: filuppladdning, `multipart/form-data`, fält `file`, max 15 MB,
typer: JPEG, PNG, WebP, HEIC/HEIF, PDF.
- Svar: `ParsedReceiptItem[]` med fälten `rawName`, `quantity`, `unit`,
`price?`, `matchedProductId?`, `matchedProductName?`,
`suggestedProductId?`, `suggestedProductName?`, `categorySuggestion?`.
- På lyckat resultat: granskningssteg där användaren bekräftar/skippar rader
och väljer produkt (via `ProductPickerField`), sedan bulk-spara till inventarie.
- Komplexitetsgrad: hög — granskningsvyn är det tyngsta steget.
**Nytt paket som krävs:**
- `file_picker: ^8.0.0` — hanterar filval på Flutter web (ger `Uint8List bytes`,
ingen filsökväg). Läggs till i `pubspec.yaml`.
**Fil-/mappstruktur:**
```
flutter/lib/features/import/
domain/
quick_import_result.dart # { markdown, source, imageUrl? }
parsed_receipt_item.dart # { rawName, quantity, unit, ... }
data/
import_repository.dart # API-anrop (multipart + JSON URL-läge)
import_providers.dart # Riverpod-providers
presentation/
import_screen.dart # TabBar: "Recept" | "Kvitto"
recipe_import_tab.dart # Fas 6a — fil + URL, laddningsindikator
receipt_import_tab.dart # Fas 6b — fil, parse, granskning, spara
```
**Router och shell:**
- Ny route `/import` inuti `ShellRoute` i `app_router.dart`.
- Ny nav-destination "Importera" med ikon `Icons.upload_file_outlined` i `app_shell.dart`,
placeras efter "Baslager" och innan "Profil".
**Felhantering:**
- Multipart-uppladdning kan ta 530 s (OCR, LLM) — `LinearProgressIndicator`
med text "Tolkar…" under hela anropet, inte en vanlig spinner.
- Timeout via `http`-klienten: sätt `Duration(seconds: 120)` för import-anrop.
- Nätverks- och serverfel mappas via befintlig `mapErrorToUserMessage`.
**Genomförandeordning:**
1. Lägg till `file_picker` i `pubspec.yaml`.
2. Utöka `CreateRecipeScreen` med `initialMarkdown`-parameter + GoRouter extra-stöd.
3. Bygg `domain/` + `data/` (modeller, repository, providers).
4. Bygg `recipe_import_tab.dart` (fas 6a — enklare).
5. Registrera route, lägg till nav-destination, verifiera end-to-end.
6. Bygg `receipt_import_tab.dart` (fas 6b — granskningssteg sist).
### Deluppgifter
- [x] Lägg till `file_picker: ^8.0.0` i `pubspec.yaml`.
- [x] Utöka `CreateRecipeScreen` med optional `initialMarkdown` via GoRouter `extra`.
- [x] Skapa `domain/quick_import_result.dart` och `domain/parsed_receipt_item.dart`.
- [x] Skapa `data/import_repository.dart` med multipart-upload + JSON URL-metoder.
- [x] Skapa `data/import_providers.dart`.
- [x] Bygg `presentation/recipe_import_tab.dart` (fil + URL, lång laddningsindikator).
- [x] Bygg `presentation/import_screen.dart` med TabBar.
- [x] Registrera `/import` i router och lägg till nav-destination i AppShell.
- [ ] Verifiera recept-import end-to-end (fil + URL → create-screen).
- [ ] Bygg `presentation/receipt_import_tab.dart` (uppladdning + granskningssteg).
- [ ] Verifiera kvitto-import end-to-end (fil → parse → granska → inventarie).
## Fas 7 - Profil/admin parity
- Profil for alla anvandare.
- Role-aware navigation och skydd for adminytor.
- Adminfunktioner migreras sist for att minimera risk i karnfloden.
## Contract-first per feature
For varje feature:
1. Verifiera request/response mot befintligt backendkontrakt.
2. Mappa modeller robust (null-safe, fallback-falt, typskillnader).
3. Kontrollera felbanor innan UI-polish.
Ingen ad-hoc backendforandring goras for att "fa Flutter att funka".
Backend-andringar for user-scope i pantry/matplan ar explicit beslutade och ska goras kontrollerat forst.
## Kvalitetsgrind (Definition of Done)
En feature ar klar nar allt nedan ar uppfyllt:
1. API-floden fungerar for bade success och fel.
2. Auth/rollskydd fungerar (inklusive 401/403).
3. Loading/empty/error ar konsekvent hanterat.
4. Navigation in/ut ur feature fungerar utan specialfall.
5. Smoke-test i testmiljo ar godkant.
## Leveransmodell
- Leverera 1 feature i taget till testdoman.
- Demo och snabb feedback innan nasta feature.
- Hall dubbel drift (Next + Flutter) tills karnfloden ar stabila.
- Flytta trafik gradvis nar parity ar verifierad.
## Nästa konkreta sprint (rekommenderad)
1. Fas 6: Import parity (URL/PDF/bild, robust felhantering).
2. Fas 7: Profil/admin parity.
3. Fortsatt flytt av UI-strängar till ARB (inventarie, pantry, recept).
4. Smoke-test på testdomän och avstämning.
## Tumregel
- Sikta pa funktionell parity forst.
- Pixel-perfect parity tas efter stabil funktion.