Files
recipe-app/flutter/next_steps_flutter.md
T

445 lines
22 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.
# Nästa steg: Flutter-migrering
Relaterade dokument:
- [README.md](README.md)
- [teknisk_beskrivning_flutter.md](teknisk_beskrivning_flutter.md)
## Mål och prioriteringar för produktion
### Övergripande mål
- **Funktionell parity:** Säkerställa att alla kärnfunktioner är stabila och fungerar som förväntat.
- **Användarupplevelse:** Förenkla onboarding och säkerställa att användare snabbt förstår appens värde.
- **Produktionsklar:** Säkerställa att appen är redo för lansering genom att adressera kritiska buggar och förbättra prestanda.
### 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.
## Arbetsplan
### Pågående arbete
- **Kvittoimport (Fas 6b):** Påbörjad men granskningssteg och bulk-spara återstår.
- **Bildimport:** Säkerställa att containrar är uppdaterade med senaste kod och att diagnostikloggar syns vid felsökning.
- **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.
### Prioriterade nästa steg
1. Slutför kvittoimport och bulk-spara.
2. Säkerställa robust bildimport och diagnostik.
3. Implementera avancerad AI-integration för produktkategorisering.
4. Utöka adminfunktioner för användarhantering och produktadministration.
5. Förbättra UI/UX för användarflöden, inklusive onboarding och profilhantering.
## 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 produktion
### Fas 1: Kritiska funktioner och buggfixar
- **Mål:** Säkerställa att alla kärnfunktioner är stabila och buggfria.
- **Åtgärder:**
- [ ] **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.
- [ ] **UI/UX-förbättringar för 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.
### Fas 2: 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.
### Fas 3: 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.
### Fas 4: 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).
# Nästa steg: Flutter-migrering
Relaterade dokument:
- [README.md](README.md)
- [teknisk_beskrivning_flutter.md](teknisk_beskrivning_flutter.md)
## Mål och prioriteringar för produktion
### Övergripande mål
- **Funktionell parity:** Säkerställa att alla kärnfunktioner är stabila och fungerar som förväntat.
- **Användarupplevelse:** Förenkla onboarding och säkerställa att användare snabbt förstår appens värde.
- **Produktionsklar:** Säkerställa att appen är redo för lansering genom att adressera kritiska buggar och förbättra prestanda.
### 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.
## Arbetsplan
### Pågående arbete
- **Kvittoimport (Fas 6b):** Påbörjad men granskningssteg och bulk-spara återstår.
- **Bildimport:** Säkerställa att containrar är uppdaterade med senaste kod och att diagnostikloggar syns vid felsökning.
- **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.
### Prioriterade nästa steg
1. Slutför kvittoimport och bulk-spara.
2. Säkerställa robust bildimport och diagnostik.
3. Implementera avancerad AI-integration för produktkategorisering.
4. Utöka adminfunktioner för användarhantering och produktadministration.
5. Förbättra UI/UX för användarflöden, inklusive onboarding och profilhantering.
## Plan för Implementering av Fas 6b
### 1. Slutför Kvittoimport
- **Aktiviteter:**
- Implementera parsers för kvitton (PDF, bildbaserade kvitton).
- Utveckla gränssnitt för att granska importerade kvitton.
- Implementera bulk-spara-funktionalitet för kvitton.
- **Tekniska Detaljer:**
- Använd `pdf-parse` och `tesseract.js` för att extrahera data från kvitton.
- Säkerställa att API-endpoints (`/receipt-import`) hanterar filuppladdning och returnerar strukturerad data.
### 2. Förbättra Bildhantering
- **Aktiviteter:**
- Säkerställa att `downloadAndOptimizeImage` fungerar korrekt i Docker-miljön.
- Implementera robust felhantering och diagnostikloggning för bildimport.
- **Tekniska Detaljer:**
- Använd miljövariabler för att definiera sökvägar för bildlagring.
- Säkerställa att bilder optimeras och lagras korrekt på servern.
### 3. Säkerställa Kompatibilitet med Linux/Ubuntu
- **Aktiviteter:**
- Kontrollera att alla sökvägar är relativa eller konfigurerbara via miljövariabler.
- Säkerställa att Docker-miljön är korrekt konfigurerad för att köra på Ubuntu.
- **Tekniska Detaljer:**
- Använd `path.join()` för att bygga sökvägar på ett plattformsoberoende sätt.
- Säkerställa att `IMAGE_DEST_DIR` är korrekt konfigurerad för Linux/Ubuntu.
### 4. Förbättra API-Integration
- **Aktiviteter:**
- Säkerställa att API-endpoints har korrekt felhantering och tidsgränser.
- Implementera robusta tidsgränser och återförsöksmekanismer för API-anrop.
- **Tekniska Detaljer:**
- Använd `http.Client` med korrekta tidsgränser för API-anrop.
- Implementera återförsöksmekanismer för tillfälliga fel.
## Verifiering och Testning
### 1. Enhets- och Integrationstester
- **Aktiviteter:**
- Skapa enhets- och integrationstester för nya parsers och API-endpoints.
- Säkerställa att alla tester körs i Docker-miljön.
- **Tekniska Detaljer:**
- Använd `flutter test` för att köra enhetstester.
- Använd `jest` eller `supertest` för att testa API-endpoints.
### 2. Manuell Testning
- **Aktiviteter:**
- Manuell testning av kvittoimport och bulk-spara-funktionalitet.
- Säkerställa att bildhantering fungerar korrekt i Docker-miljön.
- **Tekniska Detaljer:**
- Använd Postman eller liknande verktyg för att testa API-endpoints.
- Säkerställa att gränssnittet för kvittoimport fungerar som förväntat.
## Slutsats
För att slutföra Fas 6b krävs implementering av parsers för kvitton, förbättringar av bildhantering, och säkerställande av kompatibilitet med Linux/Ubuntu. En robust API-integration och omfattande testning är avgörande för att säkerställa att importfunktionen fungerar som förväntat i produktion.