diff --git a/apps/web/messages/it.json b/apps/web/messages/it.json index 65dd103..6337d6d 100644 --- a/apps/web/messages/it.json +++ b/apps/web/messages/it.json @@ -9,6 +9,11 @@ "signOut": "Esci", "completeProfile": "Completa il tuo profilo" }, + "CookieBanner": { + "aria": "Informativa cookie", + "message": "Usiamo solo cookie essenziali per l'autenticazione e la sessione. Niente analytics o tracker di terze parti.", + "dismiss": "Ho capito" + }, "Metadata": { "title": "KetoPath — Chetogenica e digiuno intermittente personalizzati", "description": "Web app italiana per la gestione strutturata di chetogenica e digiuno intermittente, con piani adattivi, tracking e lista della spesa automatica." diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx index b053649..757913c 100644 --- a/apps/web/src/app/[locale]/layout.tsx +++ b/apps/web/src/app/[locale]/layout.tsx @@ -5,6 +5,7 @@ import { NextIntlClientProvider } from 'next-intl'; import { getMessages, getTranslations, setRequestLocale } from 'next-intl/server'; import type { ReactNode } from 'react'; +import { CookieBanner } from '@/components/cookie-banner'; import { locales, type Locale } from '@/i18n'; import '@/styles/globals.css'; @@ -48,9 +49,10 @@ export default async function LocaleLayout({ return ( - + {children} + diff --git a/apps/web/src/components/cookie-banner.tsx b/apps/web/src/components/cookie-banner.tsx new file mode 100644 index 0000000..3535ff6 --- /dev/null +++ b/apps/web/src/components/cookie-banner.tsx @@ -0,0 +1,42 @@ +'use client'; + +import { useTranslations } from 'next-intl'; +import { useEffect, useState } from 'react'; + +import { Button } from '@/components/ui/button'; + +const STORAGE_KEY = 'ketopath:cookie-notice-ack'; + +export function CookieBanner() { + const t = useTranslations('CookieBanner'); + const [visible, setVisible] = useState(false); + + useEffect(() => { + if (typeof window === 'undefined') return; + if (window.localStorage.getItem(STORAGE_KEY) !== 'true') { + setVisible(true); + } + }, []); + + function dismiss() { + window.localStorage.setItem(STORAGE_KEY, 'true'); + setVisible(false); + } + + if (!visible) return null; + + return ( +
+
+

{t('message')}

+ +
+
+ ); +}