"use client";
import { useEffect, useState } from "react";
type Consent = {
necessary: true;
analytics: boolean;
marketing: boolean;
timestamp: number;
};
export function CookieBanner() {
const [consent, setConsent] = useState<Consent | null>(null);
const [visible, setVisible] = useState(false);
useEffect(() => {
const stored = localStorage.getItem("cookie_consent");
if (!stored) setVisible(true);
else setConsent(JSON.parse(stored));
}, []);
const save = (c: Omit<Consent, "necessary" | "timestamp">) => {
const full: Consent = { ...c, necessary: true, timestamp: Date.now() };
localStorage.setItem("cookie_consent", JSON.stringify(full));
setConsent(full);
setVisible(false);
// Aici încărci GA4/Meta/etc DOAR dacă c.analytics === true
};
if (!visible) return null;
return (
<div className="fixed inset-x-0 bottom-0 z-50 bg-zinc-900 p-4 text-sm text-white">
<p>Folosim cookie-uri pentru analytics și marketing. Citește
<a href="/politica-confidentialitate"> politica noastră</a>.
</p>
<div className="mt-3 flex gap-2">
<button onClick={() => save({ analytics: false, marketing: false })}>
Doar esențiale
</button>
<button onClick={() => save({ analytics: true, marketing: true })}>
Accept tot
</button>
</div>
</div>
);
}Ce trebuie să aibă un cookie banner în 2026
ANSPDCP (autoritatea română) și Board-ul European EDPB au emis ghiduri clare. Un banner e legal DOAR dacă respectă toate condițiile:
1. Consimțământ DINAINTE de setarea cookie-urilor non-esențiale
Nu setezi GA4, Meta Pixel, Hotjar etc. până nu apeși "Accept". Asta înseamnă:
- Fără "Accept All" presat automat
- Fără "continuând navigarea sunteți de acord" (ilegal din 2019)
- Cookie-ul de preferință se pune doar după alegere
2. Refuzul la fel de ușor ca acceptul
Trebuie să ai două butoane la același nivel vizual:
- "Accept" + "Refuz" (sau "Doar esențiale")
- NU: "Accept" mare verde + "Setări" mic alb
Banner-urile gen "Accept all" prominent + "Manage" ascuns = amendă garantată.
3. Consimțământ granular
Utilizatorul trebuie să poată accepta selectiv:
- Necesare (non-optional, pre-bifat OK)
- Analitice (GA4, Plausible)
- Marketing (Meta Pixel, TikTok, Google Ads)
- Personalizare (A/B testing, remarketing)
4. Posibilitate de retragere
Link "Modifică preferințe cookie" în footer — permanent. Retragerea trebuie să fie la fel de simplă ca acordul inițial.
5. Dovada consimțământului
Salvezi în DB / localStorage:
- Timestamp
- Versiunea politicii acceptate
- IP hash-uit (opțional — unele interpretări GDPR spun că nu e necesar)
- Categoriile acceptate
Cod gata făcut (React / Next.js)
Vezi snippet-ul de mai sus. E structura minimă — pentru producție adaugi:
- Versionare consent — când actualizezi politica, reset forțat
- Audit log — DB cu toate consent-urile
- Google Consent Mode v2 — obligatoriu din 2024 dacă rulezi Google Ads în SEE
Google Consent Mode v2 — obligatoriu
Dacă folosești Google Ads / Analytics în EEA, trebuie să implementezi Consent Mode v2. Altfel advertising-ul e restricționat.
gtag('consent', 'default', {
'ad_storage': 'denied',
'analytics_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
});
// După accept
gtag('consent', 'update', {
'ad_storage': 'granted',
'analytics_storage': 'granted',
});
Ce NU e legal (greșeli comune)
- Banner doar cu buton "OK" / "Am înțeles" (nu e alegere)
- Pre-bifat "Accept all" in setări avansate
- "Continuând navigarea..." = consent implicit (nul)
- Blocarea site-ului fără accept (cookie wall) — permisă doar rareori și cu alternativă contra-cost
Amenzi reale în România
ANSPDCP a dat amenzi de 10 000–100 000 € în 2024–2025 pentru banner-uri incorect implementate. Nu e ipoteză.
Vrei audit GDPR + fix?
Fac audit GDPR + implementare consent mode corect la ~250 €. Scrie aici.