'use client' import { useState, useEffect } from 'react' interface ConsentState { analytics: boolean marketing: boolean functional: boolean hasConsented: boolean timestamp?: string } const defaultConsent: ConsentState = { analytics: false, marketing: false, functional: false, hasConsented: false, } const STORAGE_KEY = 'pdpa_consent' export function CookieBanner() { const [consent, setConsent] = useState(defaultConsent) const [showBanner, setShowBanner] = useState(false) const [showPreferences, setShowPreferences] = useState(false) // Load consent from localStorage on mount useEffect(() => { const stored = localStorage.getItem(STORAGE_KEY) if (stored) { try { const parsed = JSON.parse(stored) setConsent(parsed) setShowBanner(false) } catch { setShowBanner(true) } } else { setShowBanner(true) } }, []) // Save consent to localStorage const saveConsent = async (newConsent: ConsentState) => { // Save to localStorage localStorage.setItem(STORAGE_KEY, JSON.stringify(newConsent)) setConsent(newConsent) setShowBanner(false) setShowPreferences(false) // Log to server try { await fetch('/api/consent', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: newConsent.hasConsented ? 'accept' : 'reject', purpose: 'all', ...newConsent, }), }) } catch (error) { console.error('Failed to log consent:', error) } } // Accept all cookies const acceptAll = () => { saveConsent({ analytics: true, marketing: true, functional: true, hasConsented: true, timestamp: new Date().toISOString(), }) } // Reject all cookies (only functional) const rejectAll = () => { saveConsent({ analytics: false, marketing: false, functional: false, hasConsented: true, timestamp: new Date().toISOString(), }) } // Save custom preferences const savePreferences = () => { saveConsent({ ...consent, hasConsented: true, timestamp: new Date().toISOString(), }) } // Update individual preference const updatePreference = (key: keyof Pick, value: boolean) => { setConsent(prev => ({ ...prev, [key]: value })) } // If no banner to show, return null if (!showBanner) return null return (
{!showPreferences ? ( // Main banner

🍪 PDPA Cookie Consent

We use cookies to enhance your experience. By continuing to visit this site, you agree to our use of cookies.{' '} Learn more

) : ( // Preferences panel

Cookie Preferences

Manage your cookie preferences below.

{/* Functional Cookies */}

Functional Cookies

Essential for the website to function properly. Cannot be disabled.

Always Active
{/* Analytics Cookies */}

Analytics Cookies

Help us understand how visitors interact with our website.

{/* Marketing Cookies */}

Marketing Cookies

Used to track visitors across websites for advertising purposes.

)}
) }