import { useState, useEffect } from 'react'; import { X, Cookie, Shield } from 'lucide-react'; interface ConsentSettings { essential: true; // niezmienne — wymagane do działania analytics: boolean; // opcjonalne marketing: boolean; // opcjonalne } const CONSENT_KEY = 'grantforge_cookie_consent'; const CONSENT_VERSION = '1.0'; // zmień przy aktualizacji polityki → ponowny baner /** * Cookie Consent Banner — zgodny z RODO Art. 7 i Dyrektywą ePrivacy. * * Zachowanie: * - Pojawia się na dole ekranu przy pierwszej wizycie (lub po zmianie wersji polityki) * - "Akceptuj wszystkie" → zapisuje zgodę w localStorage * - "Tylko niezbędne" → tylko essential=true * - "Ustawienia" → rozwijane opcje szczegółowe * - Nie blokuje korzystania z aplikacji * * Integracja z backendem: * Po zapisaniu zgody wywołaj POST /api/user/consent z payload { settings }. */ export function CookieConsentBanner() { const [visible, setVisible] = useState(false); const [expanded, setExpanded] = useState(false); const [settings, setSettings] = useState({ essential: true, analytics: false, marketing: false, }); useEffect(() => { try { const stored = localStorage.getItem(CONSENT_KEY); if (stored) { const parsed = JSON.parse(stored); // Pokazuj ponownie jeśli wersja się zmieniła if (parsed.version !== CONSENT_VERSION) { setVisible(true); } } else { // Pierwsze wejście setVisible(true); } } catch { setVisible(true); } }, []); const saveConsent = (chosen: ConsentSettings) => { const record = { version: CONSENT_VERSION, ...chosen, timestamp: new Date().toISOString() }; localStorage.setItem(CONSENT_KEY, JSON.stringify(record)); setVisible(false); // Opcjonalnie: wyślij do backendu try { fetch('/api/user/consent', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ consent: record }), }).catch(() => {}); // fire-and-forget } catch {} }; if (!visible) return null; return (
{/* Header */}

Twoja prywatność ma znaczenie

Używamy plików cookie, aby zapewnić właściwe działanie platformy. Możesz wybrać, które kategorie akceptujesz.{' '} Polityka prywatności

{/* Szczegóły rozwijane */} {expanded && (
{/* Essential — zawsze włączone */} } checked={true} disabled={true} onChange={() => {}} /> {/* Analytics */} 📊} checked={settings.analytics} disabled={false} onChange={(v) => setSettings(s => ({ ...s, analytics: v }))} /> {/* Marketing */} 📣} checked={settings.marketing} disabled={false} onChange={(v) => setSettings(s => ({ ...s, marketing: v }))} />
)} {/* Przyciski */}
); } // ── Pomocniczy wiersz ustawienia ───────────────────────────────────────────── function ConsentRow({ label, description, icon, checked, disabled, onChange }: { label: string; description: string; icon: React.ReactNode; checked: boolean; disabled: boolean; onChange: (v: boolean) => void; }) { return (
{icon}
{label}
{description}
); } export default CookieConsentBanner;