diff --git a/messages/de.json b/messages/de.json index 637089669..7798c950e 100644 --- a/messages/de.json +++ b/messages/de.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "Was gespeichert wird", - "measurements": "Messwerte (Gewicht, Blutdruck, Puls, Glukose, Schlaf, Körperzusammensetzung)", - "medications": "Medikamente und Einnahmeverlauf", - "moodLabs": "Stimmungseinträge und Laborwerte", - "coach": "Coach-Unterhaltungen", + "measurements": "Messwerte: Gewicht, Blutdruck, Puls und jeder weitere Wert, den du oder ein Gerät erfasst", "integrations": "Integrations-Tokens (verschlüsselt)", - "security": "Konto- und Sicherheitsaktivität (Sitzungen, Anmeldeprotokoll)" + "security": "Konto- und Sicherheitsaktivität (Sitzungen, Anmeldeprotokoll)", + "profile": "Dein Profil, deine Anamnese und die Angaben für die Gesundheitsakte", + "modules": "Einträge der Module: {list}" }, "retention": { "title": "Aufbewahrung", diff --git a/messages/en.json b/messages/en.json index 185bd2226..476b9030e 100644 --- a/messages/en.json +++ b/messages/en.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "What's stored", - "measurements": "Measurements (weight, blood pressure, pulse, glucose, sleep, body composition)", - "medications": "Medications and intake history", - "moodLabs": "Mood entries and lab results", - "coach": "Coach conversations", + "measurements": "Measurements: weight, blood pressure, pulse and every other value you or a device record", "integrations": "Integration tokens (encrypted)", - "security": "Account and security activity (sessions, sign-in log)" + "security": "Account and security activity (sessions, sign-in log)", + "profile": "Your profile, medical history and health-record details", + "modules": "Records of each module: {list}" }, "retention": { "title": "Retention", diff --git a/messages/es.json b/messages/es.json index 787114de2..7bc772cdd 100644 --- a/messages/es.json +++ b/messages/es.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "Qué se almacena", - "measurements": "Mediciones (peso, presión arterial, pulso, glucosa, sueño, composición corporal)", - "medications": "Medicamentos e historial de tomas", - "moodLabs": "Entradas de estado de ánimo y resultados de laboratorio", - "coach": "Conversaciones con el asistente", + "measurements": "Mediciones: peso, presión arterial, pulso y cualquier otro valor que registres tú o un dispositivo", "integrations": "Tokens de integración (cifrados)", - "security": "Actividad de la cuenta y de seguridad (sesiones, registro de inicio de sesión)" + "security": "Actividad de la cuenta y de seguridad (sesiones, registro de inicio de sesión)", + "profile": "Tu perfil, tus antecedentes médicos y los datos del historial de salud", + "modules": "Registros de cada módulo: {list}" }, "retention": { "title": "Retención", diff --git a/messages/fr.json b/messages/fr.json index 7803ab4f4..d13999e72 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "Ce qui est stocké", - "measurements": "Mesures (poids, tension, pouls, glycémie, sommeil, composition corporelle)", - "medications": "Médicaments et historique des prises", - "moodLabs": "Entrées d'humeur et résultats de laboratoire", - "coach": "Conversations avec le coach", + "measurements": "Mesures : poids, tension, pouls et toute autre valeur enregistrée par vous ou un appareil", "integrations": "Jetons d'intégration (chiffrés)", - "security": "Activité du compte et de sécurité (sessions, journal de connexion)" + "security": "Activité du compte et de sécurité (sessions, journal de connexion)", + "profile": "Votre profil, vos antécédents médicaux et les informations du dossier de santé", + "modules": "Données de chaque module : {list}" }, "retention": { "title": "Conservation", diff --git a/messages/it.json b/messages/it.json index e959745d9..e2d3097cb 100644 --- a/messages/it.json +++ b/messages/it.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "Cosa viene memorizzato", - "measurements": "Misurazioni (peso, pressione, polso, glicemia, sonno, composizione corporea)", - "medications": "Farmaci e cronologia delle assunzioni", - "moodLabs": "Voci dell'umore e referti di laboratorio", - "coach": "Conversazioni con il coach", + "measurements": "Misurazioni: peso, pressione, battito e ogni altro valore registrato da te o da un dispositivo", "integrations": "Token di integrazione (cifrati)", - "security": "Attività dell'account e di sicurezza (sessioni, registro degli accessi)" + "security": "Attività dell'account e di sicurezza (sessioni, registro degli accessi)", + "profile": "Il tuo profilo, l'anamnesi e i dati della cartella sanitaria", + "modules": "Dati di ogni modulo: {list}" }, "retention": { "title": "Conservazione", diff --git a/messages/ko.json b/messages/ko.json index b6abad7a8..933ed797e 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "저장되는 항목", - "measurements": "측정값 (체중, 혈압, 맥박, 혈당, 수면, 체성분)", - "medications": "약과 복용 기록", - "moodLabs": "기분 기록과 검사 결과", - "coach": "코치 대화", + "measurements": "측정값: 체중, 혈압, 맥박과 직접 또는 기기로 기록한 모든 값", "integrations": "연동 토큰 (암호화됨)", - "security": "계정·보안 활동 (세션, 로그인 기록)" + "security": "계정·보안 활동 (세션, 로그인 기록)", + "profile": "프로필, 병력, 건강 기록 정보", + "modules": "모듈별 기록: {list}" }, "retention": { "title": "보관 기간", diff --git a/messages/pl.json b/messages/pl.json index a6f21206f..733555615 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -6987,12 +6987,11 @@ }, "stored": { "title": "Co jest przechowywane", - "measurements": "Pomiary (waga, ciśnienie, tętno, glukoza, sen, skład ciała)", - "medications": "Leki i historia przyjmowania", - "moodLabs": "Wpisy nastroju i wyniki badań laboratoryjnych", - "coach": "Rozmowy z asystentem", + "measurements": "Pomiary: waga, ciśnienie, tętno i każda inna wartość zapisana przez ciebie lub urządzenie", "integrations": "Tokeny integracji (szyfrowane)", - "security": "Aktywność konta i zabezpieczeń (sesje, dziennik logowań)" + "security": "Aktywność konta i zabezpieczeń (sesje, dziennik logowań)", + "profile": "Twój profil, wywiad medyczny i dane dokumentacji zdrowotnej", + "modules": "Wpisy poszczególnych modułów: {list}" }, "retention": { "title": "Retencja", diff --git a/src/components/settings/__tests__/privacy-stored-list.test.tsx b/src/components/settings/__tests__/privacy-stored-list.test.tsx new file mode 100644 index 000000000..b81c53ccc --- /dev/null +++ b/src/components/settings/__tests__/privacy-stored-list.test.tsx @@ -0,0 +1,59 @@ +/** + * Settings → Data & privacy: "What's stored" is read off the module registry, + * so every module that keeps records is named and a new one joins the list + * without an edit here. + */ +import { renderToStaticMarkup } from "react-dom/server"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("@tanstack/react-query", () => ({ + useQuery: () => ({ data: undefined, isLoading: true, isError: false }), + useQueryClient: () => ({ invalidateQueries: vi.fn() }), + useMutation: () => ({ mutate: vi.fn(), isPending: false }), +})); +vi.mock("@/hooks/use-auth", () => ({ + useAuth: () => ({ user: null, isAuthenticated: true, isLoading: false }), +})); +vi.mock("@/components/settings/security-sessions-card", () => ({ + SecuritySessionsCard: () => null, +})); +vi.mock("@/components/settings/security-activity-card", () => ({ + SecurityActivityCard: () => null, +})); +vi.mock("@/components/settings/trusted-devices-card", () => ({ + TrustedDevicesCard: () => null, +})); + +import { I18nProvider } from "@/lib/i18n/context"; +import { MODULE_KEYS, MODULE_REGISTRY } from "@/lib/modules/registry"; +import { PrivacySection, storedModuleLabelKeys } from "../privacy-section"; + +function render(): string { + return renderToStaticMarkup( + + + , + ); +} + +describe("Data & privacy — what's stored", () => { + it("names every module that keeps records", () => { + const keys = storedModuleLabelKeys(); + for (const key of MODULE_KEYS) { + const { category, labelKey } = MODULE_REGISTRY[key]; + const holdsRecords = category !== "export" && category !== "integration"; + expect(keys.includes(labelKey), key).toBe(holdsRecords); + } + }); + + it("lists documents, vaccinations, the cycle and workouts on the page", () => { + const html = render(); + const row = html.match(/data-slot="privacy-stored-modules"[^>]*>([^<]*) MODULE_REGISTRY[key]) + .filter((m) => m.category !== "export" && m.category !== "integration") + .map((m) => m.labelKey); +} + export function PrivacySection() { - const { t } = useTranslations(); + const { t, locale } = useTranslations(); const { isAuthenticated } = useAuth(); const { @@ -91,11 +106,20 @@ export function PrivacySection() { icon={Database} title={t("settings.privacy.stored.title")} /> -