diff --git a/messages/de.json b/messages/de.json index 01784ec8b..28f7422d6 100644 --- a/messages/de.json +++ b/messages/de.json @@ -6208,5 +6208,56 @@ "deleteN": "Löschen ({count})", "clearSelection": "Auswahl aufheben", "selectionBarLabel": "Auswahlaktionen" + }, + "measurementReminders": { + "sectionTitle": "Vorsorge", + "sectionDescription": "Erinnerungen, was wann und wo zu messen oder zu prüfen ist.", + "addButton": "Erinnerung hinzufügen", + "markDone": "Erledigt", + "delete": "Löschen", + "disabledBadge": "Aus", + "nextDue": { + "none": "Nicht geplant", + "today": "Heute fällig", + "tomorrow": "Morgen fällig", + "inDays": "In {days} Tagen" + }, + "overdueByDays": "Überfällig seit {days} Tagen", + "cadence": { + "everyNDays": "Alle {days} Tage", + "custom": "Eigener Zeitplan" + }, + "location": { + "prefix": "Bei: {location}" + }, + "types": { + "WEIGHT": "Gewicht", + "BLOOD_PRESSURE_SYS": "Blutdruck", + "PULSE": "Puls", + "BLOOD_GLUCOSE": "Blutzucker", + "OXYGEN_SATURATION": "Sauerstoffsättigung", + "BODY_FAT": "Körperfett", + "BODY_TEMPERATURE": "Körpertemperatur" + }, + "empty": { + "title": "Noch keine Erinnerungen", + "description": "Füge eine Erinnerung hinzu, um z. B. regelmäßig den Blutdruck zu messen oder ein jährliches Blutbild zu planen." + }, + "form": { + "label": "Bezeichnung", + "labelPlaceholder": "z. B. Blutdruck messen", + "kind": "Art", + "kindType": "Mit einer Messung verknüpft", + "kindFreeText": "Freitext-Prüfung", + "measurementType": "Messwert", + "cadence": "Wiederholung", + "notifyHour": "Erinnern um", + "location": "Wo (optional)", + "locationPlaceholder": "z. B. Hausarzt, Labor", + "save": "Speichern" + }, + "pushTitle": "Vorsorge-Erinnerung", + "pushBody": "Fällig: {label}", + "pushLocation": "(bei {location})" } } diff --git a/messages/en.json b/messages/en.json index a78cc1a24..88748e36d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -6208,5 +6208,56 @@ "deleteN": "Delete ({count})", "clearSelection": "Clear selection", "selectionBarLabel": "Selection actions" + }, + "measurementReminders": { + "sectionTitle": "Preventive care", + "sectionDescription": "Reminders for what to measure or check, when, and where.", + "addButton": "Add reminder", + "markDone": "Done", + "delete": "Delete", + "disabledBadge": "Off", + "nextDue": { + "none": "Not scheduled", + "today": "Due today", + "tomorrow": "Due tomorrow", + "inDays": "In {days} days" + }, + "overdueByDays": "Overdue by {days} days", + "cadence": { + "everyNDays": "Every {days} days", + "custom": "Custom schedule" + }, + "location": { + "prefix": "At: {location}" + }, + "types": { + "WEIGHT": "Weight", + "BLOOD_PRESSURE_SYS": "Blood pressure", + "PULSE": "Pulse", + "BLOOD_GLUCOSE": "Blood glucose", + "OXYGEN_SATURATION": "Oxygen saturation", + "BODY_FAT": "Body fat", + "BODY_TEMPERATURE": "Body temperature" + }, + "empty": { + "title": "No reminders yet", + "description": "Add a reminder to measure your blood pressure on a cadence, or to schedule an annual blood panel." + }, + "form": { + "label": "Label", + "labelPlaceholder": "e.g. Measure blood pressure", + "kind": "Type", + "kindType": "Linked to a measurement", + "kindFreeText": "Free-text check", + "measurementType": "Measurement", + "cadence": "Repeat", + "notifyHour": "Remind at", + "location": "Where (optional)", + "locationPlaceholder": "e.g. GP, Lab", + "save": "Save" + }, + "pushTitle": "Preventive-care reminder", + "pushBody": "Time for: {label}", + "pushLocation": "(at {location})" } } diff --git a/messages/es.json b/messages/es.json index 07ef722cb..d8c7e315e 100644 --- a/messages/es.json +++ b/messages/es.json @@ -6208,5 +6208,56 @@ "deleteN": "Eliminar ({count})", "clearSelection": "Borrar selección", "selectionBarLabel": "Acciones de selección" + }, + "measurementReminders": { + "sectionTitle": "Prevención", + "sectionDescription": "Recordatorios de qué medir o revisar, cuándo y dónde.", + "addButton": "Añadir recordatorio", + "markDone": "Hecho", + "delete": "Eliminar", + "disabledBadge": "Apagado", + "nextDue": { + "none": "Sin programar", + "today": "Vence hoy", + "tomorrow": "Vence mañana", + "inDays": "En {days} días" + }, + "overdueByDays": "Vencido hace {days} días", + "cadence": { + "everyNDays": "Cada {days} días", + "custom": "Programación personalizada" + }, + "location": { + "prefix": "En: {location}" + }, + "types": { + "WEIGHT": "Peso", + "BLOOD_PRESSURE_SYS": "Presión arterial", + "PULSE": "Pulso", + "BLOOD_GLUCOSE": "Glucosa en sangre", + "OXYGEN_SATURATION": "Saturación de oxígeno", + "BODY_FAT": "Grasa corporal", + "BODY_TEMPERATURE": "Temperatura corporal" + }, + "empty": { + "title": "Aún no hay recordatorios", + "description": "Añade un recordatorio para medir la presión arterial con regularidad o programar un análisis de sangre anual." + }, + "form": { + "label": "Etiqueta", + "labelPlaceholder": "p. ej. Medir la presión arterial", + "kind": "Tipo", + "kindType": "Vinculado a una medición", + "kindFreeText": "Comprobación de texto libre", + "measurementType": "Medición", + "cadence": "Repetir", + "notifyHour": "Recordar a las", + "location": "Dónde (opcional)", + "locationPlaceholder": "p. ej. Médico, Laboratorio", + "save": "Guardar" + }, + "pushTitle": "Recordatorio de prevención", + "pushBody": "Toca: {label}", + "pushLocation": "(en {location})" } } diff --git a/messages/fr.json b/messages/fr.json index acec48c77..3831846ad 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -6208,5 +6208,56 @@ "deleteN": "Supprimer ({count})", "clearSelection": "Effacer la sélection", "selectionBarLabel": "Actions de sélection" + }, + "measurementReminders": { + "sectionTitle": "Prévention", + "sectionDescription": "Rappels de ce qu'il faut mesurer ou vérifier, quand et où.", + "addButton": "Ajouter un rappel", + "markDone": "Terminé", + "delete": "Supprimer", + "disabledBadge": "Désactivé", + "nextDue": { + "none": "Non planifié", + "today": "À faire aujourd'hui", + "tomorrow": "À faire demain", + "inDays": "Dans {days} jours" + }, + "overdueByDays": "En retard de {days} jours", + "cadence": { + "everyNDays": "Tous les {days} jours", + "custom": "Planning personnalisé" + }, + "location": { + "prefix": "Chez : {location}" + }, + "types": { + "WEIGHT": "Poids", + "BLOOD_PRESSURE_SYS": "Tension artérielle", + "PULSE": "Pouls", + "BLOOD_GLUCOSE": "Glycémie", + "OXYGEN_SATURATION": "Saturation en oxygène", + "BODY_FAT": "Masse grasse", + "BODY_TEMPERATURE": "Température corporelle" + }, + "empty": { + "title": "Aucun rappel pour l'instant", + "description": "Ajoutez un rappel pour mesurer régulièrement votre tension ou planifier un bilan sanguin annuel." + }, + "form": { + "label": "Libellé", + "labelPlaceholder": "ex. Mesurer la tension", + "kind": "Type", + "kindType": "Lié à une mesure", + "kindFreeText": "Vérification libre", + "measurementType": "Mesure", + "cadence": "Répétition", + "notifyHour": "Rappeler à", + "location": "Où (facultatif)", + "locationPlaceholder": "ex. Médecin, Laboratoire", + "save": "Enregistrer" + }, + "pushTitle": "Rappel de prévention", + "pushBody": "C'est l'heure : {label}", + "pushLocation": "(chez {location})" } } diff --git a/messages/it.json b/messages/it.json index e825a1770..6c959630c 100644 --- a/messages/it.json +++ b/messages/it.json @@ -6208,5 +6208,56 @@ "deleteN": "Elimina ({count})", "clearSelection": "Cancella selezione", "selectionBarLabel": "Azioni di selezione" + }, + "measurementReminders": { + "sectionTitle": "Prevenzione", + "sectionDescription": "Promemoria su cosa misurare o controllare, quando e dove.", + "addButton": "Aggiungi promemoria", + "markDone": "Fatto", + "delete": "Elimina", + "disabledBadge": "Disattivato", + "nextDue": { + "none": "Non pianificato", + "today": "In scadenza oggi", + "tomorrow": "In scadenza domani", + "inDays": "Tra {days} giorni" + }, + "overdueByDays": "In ritardo di {days} giorni", + "cadence": { + "everyNDays": "Ogni {days} giorni", + "custom": "Pianificazione personalizzata" + }, + "location": { + "prefix": "Presso: {location}" + }, + "types": { + "WEIGHT": "Peso", + "BLOOD_PRESSURE_SYS": "Pressione sanguigna", + "PULSE": "Battito", + "BLOOD_GLUCOSE": "Glicemia", + "OXYGEN_SATURATION": "Saturazione di ossigeno", + "BODY_FAT": "Grasso corporeo", + "BODY_TEMPERATURE": "Temperatura corporea" + }, + "empty": { + "title": "Ancora nessun promemoria", + "description": "Aggiungi un promemoria per misurare regolarmente la pressione o pianificare un esame del sangue annuale." + }, + "form": { + "label": "Etichetta", + "labelPlaceholder": "es. Misurare la pressione", + "kind": "Tipo", + "kindType": "Collegato a una misurazione", + "kindFreeText": "Controllo a testo libero", + "measurementType": "Misurazione", + "cadence": "Ripeti", + "notifyHour": "Ricorda alle", + "location": "Dove (facoltativo)", + "locationPlaceholder": "es. Medico, Laboratorio", + "save": "Salva" + }, + "pushTitle": "Promemoria di prevenzione", + "pushBody": "È ora di: {label}", + "pushLocation": "(presso {location})" } } diff --git a/messages/pl.json b/messages/pl.json index b551d7b0b..cb4719c43 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -6208,5 +6208,56 @@ "deleteN": "Usuń ({count})", "clearSelection": "Wyczyść zaznaczenie", "selectionBarLabel": "Akcje zaznaczenia" + }, + "measurementReminders": { + "sectionTitle": "Profilaktyka", + "sectionDescription": "Przypomnienia, co, kiedy i gdzie zmierzyć lub sprawdzić.", + "addButton": "Dodaj przypomnienie", + "markDone": "Gotowe", + "delete": "Usuń", + "disabledBadge": "Wył.", + "nextDue": { + "none": "Niezaplanowane", + "today": "Termin dzisiaj", + "tomorrow": "Termin jutro", + "inDays": "Za {days} dni" + }, + "overdueByDays": "Zaległe od {days} dni", + "cadence": { + "everyNDays": "Co {days} dni", + "custom": "Własny harmonogram" + }, + "location": { + "prefix": "U: {location}" + }, + "types": { + "WEIGHT": "Waga", + "BLOOD_PRESSURE_SYS": "Ciśnienie krwi", + "PULSE": "Tętno", + "BLOOD_GLUCOSE": "Glukoza we krwi", + "OXYGEN_SATURATION": "Saturacja tlenem", + "BODY_FAT": "Tkanka tłuszczowa", + "BODY_TEMPERATURE": "Temperatura ciała" + }, + "empty": { + "title": "Brak przypomnień", + "description": "Dodaj przypomnienie, aby regularnie mierzyć ciśnienie krwi lub zaplanować coroczne badanie krwi." + }, + "form": { + "label": "Etykieta", + "labelPlaceholder": "np. Zmierz ciśnienie krwi", + "kind": "Typ", + "kindType": "Powiązane z pomiarem", + "kindFreeText": "Sprawdzenie tekstowe", + "measurementType": "Pomiar", + "cadence": "Powtarzaj", + "notifyHour": "Przypomnij o", + "location": "Gdzie (opcjonalnie)", + "locationPlaceholder": "np. Lekarz, Laboratorium", + "save": "Zapisz" + }, + "pushTitle": "Przypomnienie profilaktyczne", + "pushBody": "Czas na: {label}", + "pushLocation": "(u {location})" } } diff --git a/src/app/vorsorge/page.tsx b/src/app/vorsorge/page.tsx new file mode 100644 index 000000000..6873b7851 --- /dev/null +++ b/src/app/vorsorge/page.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { Loader2 } from "lucide-react"; + +import { useAuth } from "@/hooks/use-auth"; +import { useMounted } from "@/hooks/use-mounted"; +import { VorsorgeSection } from "@/components/measurement-reminders/vorsorge-section"; + +/** + * v1.17.1 — Vorsorge (preventive-care) reminders page. The dedicated + * feature surface for "wann muss ich was wo machen". Auth-gated; the + * section component owns the list + create flow. + */ +export default function VorsorgePage() { + const { isAuthenticated, isLoading } = useAuth(); + const mounted = useMounted(); + + if (!mounted || isLoading) { + return ( +
+ {t("measurementReminders.sectionDescription")} +
+{reminder.label}
+ {!reminder.enabled && ( +
+
+ {t("measurementReminders.location.prefix", { + location: reminder.location, + })} +
+ )} +