feat: §6 quick wins (Gruppo A) — 5 quality-of-life che chiudono gap user-flow
A1. Notifiche per-pasto (PRD §6.3)
- NotificationSettings.mealReminders (default off)
- 3 ScheduledTask aggiuntivi: 13:00 pranzo, 16:00 spuntino, 19:00 cena
Europe/Rome
- runMealReminderJob: skip se utente in pausa, altrimenti push "Ora di
pranzo: vedi cosa c'è nel piano di oggi" → /plan
- Toggle in /profile sezione notifiche
A2. Auto-start digiuno a fine cena (PRD §6.3)
- POST /me/meal-plans/slots/:id/consumed: se è il "pasto finale" del
giorno (CENA o ultimo dello schedule IF) e l'utente ha preferences.
fastingProtocol senza FastEvent IN_PROGRESS → crea automaticamente
un nuovo digiuno col protocollo preferito
- isMealLastOfDay helper (rank-based: COL=0, PRA=1, SPU=2, CENA=3)
- Risposta include autoStartedFast: { id } | null
A3. Riassunto piano nel done step onboarding (PRD §6.1.9)
- StepDone fetcha il profilo dopo regenerate
- Card 4-colonne con Fase corrente + durata, BMR, TDEE, aderenza target
- i18n: phaseLabel + phaseDuration
A4. "% del percorso" in /tracking (PRD §6.4.5)
- WeightHistory accetta startKg, calcola (start-current)/(start-goal)
clampato 0-100
- 4° card nel summary: "Del percorso · 65%"
A5. Lista spesa: spuntati in fondo + totale rimanente (PRD §6.5.4-5)
- ShoppingChecklist sort items con consumed=true in fondo,
alfabetico tra non-spuntati
- "Restano €X" mostrato accanto al "n di total" — solo non-spuntati
i18n: namespace Notifications, Onboarding, Tracking, Shopping estesi.
81/81 unit test verdi. Lint, typecheck verdi.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
60a3d072f6
commit
4633f42bc5
11 files changed
+351
-53
No files matched your search
@@ -189,6 +189,7 @@
|
||||
"delta": "Variazione",
|
||||
"emptyHistory": "Nessuna rilevazione registrata. Inserisci la prima a destra: la tendenza apparirà dopo due o tre pesate.",
|
||||
"weeklyTrend": "Trend settimanale",
|
||||
"journey": "Del percorso",
|
||||
"projection": "Al ritmo attuale raggiungerai {kg} kg il {date}.",
|
||||
"alertEyebrow": "Soglia di allarme",
|
||||
"alertMessage": "Il tuo peso è {current} kg, sopra la soglia di {threshold} kg che hai impostato.",
|
||||
@@ -280,6 +281,21 @@
|
||||
"notificationsBlocked": "Hai bloccato le notifiche per questo sito. Le potrai riattivare dalle impostazioni del browser.",
|
||||
"notificationsUnsupported": "Il tuo browser non supporta le notifiche push. Su iOS apri prima KetoPath dalla Home.",
|
||||
"notificationsError": "Non è stato possibile attivarle. Riprova più tardi dal tuo profilo.",
|
||||
"summaryPhase": "Fase corrente",
|
||||
"summaryBmr": "BMR",
|
||||
"summaryTdee": "Fabbisogno",
|
||||
"summaryAdherence": "Aderenza target",
|
||||
"summaryAdherenceHint": "Per fase 1",
|
||||
"phaseLabel": {
|
||||
"INTENSIVE": "Intensiva",
|
||||
"TRANSITION": "Transizione",
|
||||
"MAINTENANCE": "Mantenimento"
|
||||
},
|
||||
"phaseDuration": {
|
||||
"INTENSIVE": "30-45 giorni",
|
||||
"TRANSITION": "30-60 giorni",
|
||||
"MAINTENANCE": "Per sempre"
|
||||
},
|
||||
"doneHeading": "Tutto pronto.",
|
||||
"doneHeadingGoal": {
|
||||
"LOSE": "Si parte. Un passo alla volta.",
|
||||
@@ -387,7 +403,9 @@
|
||||
"weeklyWeighInLabel": "Promemoria pesata settimanale",
|
||||
"weeklyWeighInHint": "Lunedì alle 09:00 ti ricordiamo la pesata della settimana.",
|
||||
"fastingMilestonesLabel": "Tappe del digiuno",
|
||||
"fastingMilestonesHint": "Ti avvisiamo all'ingresso in chetogenesi e all'autofagia. Disponibile a breve.",
|
||||
"fastingMilestonesHint": "Idratazione ogni 2h, alert elettroliti oltre le 18h, 30 min prima della fine.",
|
||||
"mealRemindersLabel": "Promemoria pasti",
|
||||
"mealRemindersHint": "Pranzo alle 13:00, spuntino alle 16:00, cena alle 19:00 — solo nei giorni non in pausa.",
|
||||
"registeredDevices": "Dispositivi registrati",
|
||||
"subscribed": "Notifiche attivate.",
|
||||
"unsubscribed": "Notifiche disattivate su questo dispositivo.",
|
||||
@@ -418,6 +436,7 @@
|
||||
"totalLabel": "Totale articoli",
|
||||
"estimatedCost": "Spesa stimata",
|
||||
"checked": "{n} di {total}",
|
||||
"remainingCost": "Restano",
|
||||
"fromRecipes": "Per: {names}",
|
||||
"categoryLabel": {
|
||||
"verdura": "Verdura",
|
||||
|
||||
Reference in new issue
Block a user