Files
recipe-app/flutter/next_steps_flutter.md
T

323 lines
16 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.
# Senaste ändringar (2026-04-24)
**Arkitektur- och UX-förbättringar:**
- Grid-vy för recept: Kolumnval (2/4/6/8) via ikon i AppShell, med Riverpod-provider och SharedPreferences.
- RecipesScreen är nu body-only, ingen egen Scaffold/AppBar.
- AppShell visar grid-ikon endast på /recipes.
- Buggfix: Produktväljaren i pantry/inventarie (ProductPickerField) — bottenark implementeras.
- Sprint 2: Databas > Produkter visar nu en riktig adminpanel i profilflödet med sök, okategoriserat-filter och bulk-kategorisering.
- Sprint 2: Användare-fliken stödjer nu Premium av/på direkt från användarmenyn.
- Kodkvalitet: Inga absoluta Windows-sökvägar.
- Dokumentation och next_steps uppdaterade.
# 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-förhandlingsbara ramar
1. Inget ska tas bort eller ändras i `recipe-api` utom explicit beslutade backend-ändringar för användarscope i pantry och matplan.
2. Inget ska tas bort eller ändras i `recipe-frontend`.
3. Migreringen sker i Flutter-spåret som separat klient mot befintliga API-kontrakt.
4. Next-frontend körs parallellt tills Flutter har verifierad parity i kärnflöden.
## Beslut 2026-04-22 - User-scope för pantry och matplan
- Pantry och matplan ska vara per användare, inte globala.
- Detta kräver backend-ändringar i `recipe-api` innan Flutter kan nå full parity för dessa flöden.
- Flutter ska följa de nya kontrakten när de finns på plats, utan klientspecifik speciallogik.
## Malbild för v1 (funktionell parity)
För v1 ska dessa flöden vara stabila i Flutter:
- [x] Auth: login, session, logout, auth-guard.
- [x] Recept: lista, detalj, skapa, uppdatera, ta bort.
- [x] Inventarie: lista, skapa, uppdatera, konsumera, historik.
- [x] Matplan: veckovy, val av recept per dag, portionsjustering, inköpslista, inventariejämförelse.
- [x] Import: quick-import + parse-markdown-flöde.
- [x] Produktadmin: lista, sök, sortera, filtrera, AI-kategorisering, merge, restore, inline kategori.
- [x] Användaradmin: lista, premium, e-post, skapa, ta bort, återställ lösenord.
## Arbetsordning för nästa sprint (2026-04-25)
### 1. Kvittoimport (OCR, bulk-spara)
- [ ] Implementera granskningssteg för kvittoimport.
- [ ] Bulk-spara för bekräftade rader.
- [ ] Säkerställa att `file_picker: ^8.0.0` är integrerat för filval på Flutter Web.
### 2. UI/UX-förbättringar
- [ ] **Adminpaneler:**
- [ ] Lägg till tydlig placeholder-text i sökfältet.
- [ ] Gör filtreringsalternativen mer visuellt tydliga.
- [ ] Lägg till bekräftelsedialog för bulk-åtgärder.
- [ ] Förbättra laddningsindikatorn för AI-kategorisering.
- [ ] **Receptvy:**
- [ ] Lägg till tydlig växlingsknapp för grid- och listvy.
- [ ] Implementera sorteringsalternativ.
- [ ] Förbättra det tomma tillståndet med en tydlig CTA.
- [ ] **Receptdetaljvy:**
- [ ] Lägg till stöd för att visa receptbilder i större format.
- [ ] Gör ingredienslistan mer läsbar.
- [ ] **Gemensamma UI-komponenter:**
- [ ] Förbättra felmeddelanden med tydliga instruktioner.
- [ ] Använd en visuellt tilltalande laddningsindikator.
- [ ] **Allmänt:**
- [ ] Säkerställa tillgänglighet med tydliga `tooltip`-texter och tillräcklig kontrast.
- [ ] Lägg till bekräftelsemeddelanden efter åtgärder.
### 3. Förbättra konverteringsvägen och onboarding
- **Mål:** Säkerställa att användare snabbt får värde och förstår appens fördelar.
- **Åtgärder:**
- **CTA (Call-to-Action):**
- [ ] Skapa tydliga och lockande CTAs som "Se vad du kan laga med det du har hemma."
- [ ] Placera CTAs strategiskt i appen för att maximera synlighet.
- **Förenkla onboarding:**
- [ ] Implementera en gästinloggning eller demo-läge så att användare kan prova appen utan att registrera sig direkt.
- [ ] Minska antalet obligatoriska fält vid registrering och implementera sociala inloggningar (t.ex. Google, Facebook).
- [ ] Skapa en kort välkomstguide för nya användare som visar de viktigaste funktionerna.
- [ ] Använd pop-up-tips eller tooltips för att visa hur man använder olika funktioner.
- **Snabb start med exempeldata:**
- [ ] Låt användare börja med förifyllt exempeldata, t.ex. en standardinköpslista eller vanliga ingredienser.
- [ ] Lägg till en "Snabbstart"-knapp som automatiskt fyller i exempeldata och visar receptförslag.
- **Fokusera på "Aha!"-momentet:**
- [ ] Visa omedelbara receptförslag när användaren lägger till sina första ingredienser.
- [ ] Generera en automatisk inköpslista baserad på de recept användaren väljer.
- **Tydliga instruktioner och feedback:**
- [ ] Visa tydliga instruktioner för varje steg i onboarding-processen.
- [ ] Ge omedelbar feedback när användaren utfört en åtgärd.
- **Användarvänlig design:**
- [ ] Håll gränssnittet enkelt och fokuserat på kärnfunktioner.
- [ ] Visa endast de viktigaste funktionerna för nya användare.
- **Möjlighet att hoppa över onboarding:**
- [ ] Lägg till en knapp som låter användare hoppa över onboarding och börja använda appen direkt.
### 4. Testa och iterera
- **Mål:** Identifiera friktion och förbättra konverteringsvägen.
- **Åtgärder:**
- [ ] Gå igenom appen som en ny användare för att identifiera eventuella problem.
- [ ] A/B-testa olika CTAs och onboarding-flöden för att se vad som fungerar bäst.
- [ ] Implementera analytik för att spåra var användare hoppar av och varför.
### 5. Anpassa till målgruppen
- **Mål:** Se till att marknadsföring och CTAs talar direkt till målgruppen.
- **Åtgärder:**
- [ ] Anpassa marknadsföring och CTAs till målgruppen (t.ex. familjer, matintresserade, meal preppers).
- [ ] Var tydlig med appens värdeproposition, t.ex. "Slipp slösa mat vi visar vad du kan laga med det du har hemma."
### 3. Avancerade adminfunktioner
- [ ] Implementera "Visa endast ändrade rader" i produktadmin.
- [ ] Säkerställa att AI-integration för kategorisering är robust.
### 4. Dokumentation och testning
- [ ] Uppdatera `README.md` med senaste ändringar.
- [ ] Lägg till testfall för nya funktioner.
- [ ] Validera med `flutter analyze` och fixa eventuella varningar.
### 5. Övrigt
- [ ] Säkerställa att alla containrar är uppdaterade för robust bildhantering.
## Prioriterad plan (ordning)
## Fas 0 - Backend-förarbete för user-scope (KLAR 2026-04-22)
- [x] Gör `PantryItem` user-scopad (userId + productId unik per användare).
- [x] Gör matplan user-scopad och filtrera list/upsert/delete per inloggad användare.
- [x] Uppdatera matplanens inventory-jämförelse till användarspecifikt pantry.
- [x] Publicera uppdaterade API-kontrakt innan vidare Flutter-parity för 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 för loading, empty, error.
- [x] Sätt en enhetlig navigationsstruktur (web först, mobil-redo).
- [x] Lokalisering: ARB-infrastruktur på plats (`flutter_localizations`, `l10n.yaml`, `app_sv.arb`, `synthetic-package: false`, `flutter gen-l10n` i Dockerfile).
- [x] Regressionstest för svenska strängkvalitet tillagd.
## Fas 2 - Auth parity (KLAR 2026-04-22)
- [x] Hårdna loginflödet (tydliga felmeddelanden, retries där relevant).
- [x] Verifiera token-livscykel (reload/hard refresh/logout).
- [x] Implementera automatisk hantering av utgången 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] Behåll backend som enda plats för matchning, validering och affärslogik.
## 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] Inköpslista och inventariejämförelse mot användarens pantry.
## Fas 6 - Import parity
### 6a — Recept-import
- [x] URL via JSON-body `{ input: string }`.
- [x] Svar: `{ markdown: string, source: 'ica'|'pdf'|'image'|'other', imageUrl?: string }`.
- [x] På lyckat resultat: navigera till `/recipes/create` med markdown-texten förifylld.
### 6b — Kvittoimport
- [ ] Endpoint: `POST /api/receipt-import`
- [ ] Läge: filuppladdning, `multipart/form-data`, fält `file`, max 15 MB.
- [ ] Svar: `ParsedReceiptItem[]` med fälten `rawName`, `quantity`, `unit`, `suggestedProductId?`, `suggestedProductName?`, `categorySuggestion?`.
- [ ] På lyckat resultat: granskningssteg där användaren bekräftar/skippar rader.
## 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).
## 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)
#### 6a — Recept-import
(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.
- Endpoint: `POST /api/receipt-import`
- Läge: filuppladdning, `multipart/form-data`, fält `file`, max 15 MB,
- Svar: `ParsedReceiptItem[]` med fälten `rawName`, `quantity`, `unit`,
`suggestedProductId?`, `suggestedProductName?`, `categorySuggestion?`.
- På lyckat resultat: granskningssteg där användaren bekräftar/skippar rader
- 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
**Router och shell:**
- Ny route `/import` inuti `ShellRoute` i `app_router.dart`.
placeras efter "Baslager" och innan "Profil".
- 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).
- [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).
- Adminfunktioner migreras sist for att minimera risk i karnfloden.
1. Verifiera request/response mot befintligt backendkontrakt.
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:
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.
## Utförda förbättringar och nästa steg (2026-04-24)
- Navigationslänkar har lagts till mellan recept, inventarie, baslager och matplan för att förenkla användarflödet.
- Efter redigering av recept och konsumtion av inventariepost sker nu automatisk navigering till relevant vy.
- Efter import av recept sker automatisk navigering till receptlistan.
- Receptdetaljvyn har fått förbättrad bakgrundsbildshantering och mjukare scrollning.
- Kodbasen har granskats för att säkerställa att inga absoluta Windows-sökvägar används.
**Nästa steg:**
- Fortsatt användartestning av nya navigationsflöden och insamling av feedback.
- Finslipa UI och tillgänglighet i samband med de nya navigationsmöjligheterna.
- Färdigställ kvittoimport och adminfunktioner enligt plan.
- Lägg till snabbfilter i Produkt-admin: "Visa endast ändrade rader" för inline-kategoribyten (planerad förbättring till nästa pass).