"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { Cookie, Settings2, X } from "lucide-react"; import { CONSENT_COOKIE_NAME, CONSENT_STORAGE_KEY, CONSENT_TTL_DAYS, CONSENT_VERSION, type ConsentState, } from "@/lib/consent-types"; type Mode = "hidden" | "banner" | "settings"; declare global { interface Window { // eslint-disable-next-line @typescript-eslint/no-explicit-any dataLayer?: any[]; gtag?: (...args: unknown[]) => void; openCookieSettings?: () => void; } } function setCookie(value: string) { const expires = new Date(); expires.setDate(expires.getDate() + CONSENT_TTL_DAYS); document.cookie = `${CONSENT_COOKIE_NAME}=${encodeURIComponent(value)}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`; } function loadConsent(): ConsentState | null { try { const raw = localStorage.getItem(CONSENT_STORAGE_KEY); if (!raw) return null; const parsed = JSON.parse(raw) as ConsentState; if (parsed.version !== CONSENT_VERSION) return null; return parsed; } catch { return null; } } function saveConsent(state: ConsentState) { localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(state)); setCookie(JSON.stringify({ a: state.analytics, m: state.marketing, p: state.preferences })); // Google Consent Mode v2 update if (typeof window !== "undefined" && window.gtag) { window.gtag("consent", "update", { ad_storage: state.marketing ? "granted" : "denied", ad_user_data: state.marketing ? "granted" : "denied", ad_personalization: state.marketing ? "granted" : "denied", analytics_storage: state.analytics ? "granted" : "denied", functionality_storage: "granted", personalization_storage: state.preferences ? "granted" : "denied", security_storage: "granted", }); } window.dispatchEvent(new CustomEvent("kovak:consent-updated", { detail: state })); } export function CookieBanner() { const [mode, setMode] = useState("hidden"); const [analytics, setAnalytics] = useState(false); const [marketing, setMarketing] = useState(false); const [preferences, setPreferences] = useState(false); useEffect(() => { const existing = loadConsent(); if (existing) { setAnalytics(existing.analytics); setMarketing(existing.marketing); setPreferences(existing.preferences); setMode("hidden"); } else { // Tarayıcı yüklendikten sonra göster, FCP'yi etkilememek için kısa gecikme const t = setTimeout(() => setMode("banner"), 800); return () => clearTimeout(t); } }, []); useEffect(() => { window.openCookieSettings = () => setMode("settings"); return () => { delete window.openCookieSettings; }; }, []); const acceptAll = () => { saveConsent({ necessary: true, analytics: true, marketing: true, preferences: true, timestamp: Date.now(), version: CONSENT_VERSION, }); setAnalytics(true); setMarketing(true); setPreferences(true); setMode("hidden"); }; const rejectAll = () => { saveConsent({ necessary: true, analytics: false, marketing: false, preferences: false, timestamp: Date.now(), version: CONSENT_VERSION, }); setAnalytics(false); setMarketing(false); setPreferences(false); setMode("hidden"); }; const saveSelection = () => { saveConsent({ necessary: true, analytics, marketing, preferences, timestamp: Date.now(), version: CONSENT_VERSION, }); setMode("hidden"); }; if (mode === "hidden") return null; return ( <> {/* Banner */} {mode === "banner" && (

Çerez tercihiniz

Web sitemizde deneyiminizi geliştirmek, trafiği analiz etmek ve reklam performansını ölçmek için çerezler kullanıyoruz.{" "} Çerez Politikası

)} {/* Settings Modal */} {mode === "settings" && (
setMode("banner")} >
e.stopPropagation()} >

Çerez ayarları

Hangi çerez türlerine izin verdiğinizi seçin.

)} ); } function CategoryRow({ title, description, checked, disabled, onChange, }: { title: string; description: string; checked: boolean; disabled?: boolean; onChange?: (v: boolean) => void; }) { return (

{title}

{description}