import { useEffect, useState, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { initGA, logPageView, initFBPixel, initFunctionalCookies } from '../utils/analytics'; import { loadGoogleTagManager } from '../services/gtm'; // Feste Übersetzungen direkt in der Komponente const translations = { de: { title: "Cookie-Einstellungen", message: "Wir nutzen Cookies zur Verbesserung der Website. Ohne Ihre Zustimmung keine Datenweitergabe an Dritte. ", acceptAll: "Alle akzeptieren", save: "Einstellungen speichern", decline: "Ablehnen", necessary: "Notwendige Cookies", necessaryDesc: "Für grundlegende Funktionen der Website", analytics: "Analyse-Cookies", analyticsDesc: "Für Analysen zur Verbesserung der Website", marketing: "Marketing-Cookies", marketingDesc: "Für personalisierte Werbung und Inhalte", functional: "Funktionale Cookies", functionalDesc: "Für erweiterte Funktionen und Personalisierung", learnMore: "Mehr erfahren", alwaysActive: "Immer aktiv" }, en: { title: "Cookie Settings", message: "This website uses cookies to enhance your browsing experience. Data will not be shared with third parties without your consent.", acceptAll: "Accept All", save: "Save Settings", decline: "Decline All", necessary: "Necessary Cookies", necessaryDesc: "For basic website functions", analytics: "Analytics Cookies", analyticsDesc: "For analyzing website usage", marketing: "Marketing Cookies", marketingDesc: "For personalized ads and content", functional: "Functional Cookies", functionalDesc: "For enhanced functionality and personalization", learnMore: "Learn more", alwaysActive: "Always active" }, sr: { title: "Podešavanja kolačića", message: "Ovaj sajt koristi kolačiće za bolje iskustvo pretraživanja. Podaci neće biti deljeni sa trećim licima bez vaše saglasnosti.", acceptAll: "Prihvati sve", save: "Sačuvaj podešavanja", decline: "Odbij sve", necessary: "Neophodni kolačići", necessaryDesc: "Za osnovne funkcije sajta", analytics: "Analitički kolačići", analyticsDesc: "Za analizu korišćenja sajta", marketing: "Marketing kolačići", marketingDesc: "Za personalizovane reklame i sadržaj", functional: "Funkcionalni kolačići", functionalDesc: "Za napredne funkcije i personalizaciju", learnMore: "Saznajte više", alwaysActive: "Uvek aktivno" } }; // Definition der verschiedenen Services const cookieServices = { essentiell: { category: 'necessary', services: [ { name: 'Session Cookies', provider: 'Eigentümer der Website', purpose: 'Speichert Ihre Sitzungsinformationen' } ] }, funktional: { category: 'functional', services: [ { name: 'Spracheinstellungen', provider: 'Eigentümer der Website', purpose: 'Speichert Ihre bevorzugte Sprache' }, { name: 'Google Fonts', provider: 'Google LLC', purpose: 'Anzeige von Webschriften' } ] }, analyse: { category: 'analytics', services: [ { name: 'Google Analytics', provider: 'Google LLC', purpose: 'Analysiert Webseitennutzung und Nutzerverhalten' } ] }, marketing: { category: 'marketing', services: [ { name: 'Google Ads', provider: 'Google LLC', purpose: 'Personalisierte Werbung' }, { name: 'Facebook Pixel', provider: 'Meta Platforms Inc.', purpose: 'Tracking von Werbekonversionen' } ] } }; interface CookieSettings { necessary: boolean; analytics: boolean; marketing: boolean; functional: boolean; } // Entfernt externe Google Fonts, falls keine Zustimmung vorliegt const removeExternalGoogleFonts = () => { // Suche nach allen Google Fonts Link-Elementen und entferne sie const linkElements = document.querySelectorAll('link[href*="fonts.googleapis.com"]'); linkElements.forEach(link => { link.parentNode?.removeChild(link); }); // Suche nach allen Google Fonts Script-Elementen und entferne sie const scriptElements = document.querySelectorAll('script[src*="fonts.googleapis.com"]'); scriptElements.forEach(script => { script.parentNode?.removeChild(script); }); }; // Funktion zum Blockieren von Google Analytics falls noch keine Zustimmung vorliegt const blockGoogleAnalytics = () => { // Entferne alle bestehenden GA Cookies document.cookie.split(';').forEach(function(c) { if (c.trim().indexOf('_ga') === 0) { document.cookie = c.trim().split('=')[0] + '=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;'; } }); }; const CookieBanner = () => { const { i18n } = useTranslation(); const [currentLang, setCurrentLang] = useState<'de' | 'en' | 'sr'>('de'); const [showBanner, setShowBanner] = useState(false); const [showSettings, setShowSettings] = useState(false); const [cookieSettings, setCookieSettings] = useState({ necessary: true, // Always true and disabled analytics: false, marketing: false, functional: false }); // Initialisiere Dienste basierend auf den Cookie-Einstellungen const initializeServices = useCallback((settings: CookieSettings) => { // Blockieren von Diensten, wenn nicht zugestimmt wurde if (!settings.functional) { removeExternalGoogleFonts(); } if (!settings.analytics) { blockGoogleAnalytics(); } else { // Initialisiere Google Analytics nur wenn ausdrücklich zugestimmt wurde initGA(); logPageView(); } // Marketing-Dienste nur mit Zustimmung if (settings.marketing) { initFBPixel(); loadGoogleTagManager(); } // Funktionale Dienste nur mit Zustimmung if (settings.functional) { initFunctionalCookies(); } }, []); // Aktuelle Sprache erkennen useEffect(() => { const lang = i18n.language.substring(0, 2); if (lang === 'de' || lang === 'en' || lang === 'sr') { setCurrentLang(lang); } else { setCurrentLang('en'); // Fallback to English } }, [i18n.language]); // Get text based on current language const getText = (key: keyof typeof translations.en) => { return translations[currentLang][key]; }; // DSGVO: Unmittelbar beim ersten Laden blockiere alle nicht-essentiellen Dienste useEffect(() => { // Blockiere externe Dienste bis Zustimmung vorliegt removeExternalGoogleFonts(); blockGoogleAnalytics(); }, []); // Prüfe beim Laden, ob bereits Zustimmung vorhanden ist useEffect(() => { try { const storedSettings = localStorage.getItem('cookieSettings'); const hasConsent = localStorage.getItem('cookieConsent'); if (storedSettings && hasConsent) { const parsedSettings = JSON.parse(storedSettings) as CookieSettings; setCookieSettings(parsedSettings); // Lade die entsprechenden Dienste basierend auf den Einstellungen initializeServices(parsedSettings); setShowBanner(false); } else { // Zeige Banner wenn keine Zustimmung vorhanden ist setShowBanner(true); } } catch (error) { console.error('Error loading cookie settings:', error); setShowBanner(true); } }, [initializeServices]); const handleSaveSettings = () => { localStorage.setItem('cookieSettings', JSON.stringify(cookieSettings)); localStorage.setItem('cookieConsent', 'true'); localStorage.setItem('cookieConsentDate', new Date().toISOString()); // Initialisiere Dienste basierend auf den ausgewählten Einstellungen initializeServices(cookieSettings); setShowSettings(false); setShowBanner(false); }; const handleAcceptAll = () => { const allSettings: CookieSettings = { necessary: true, analytics: true, marketing: true, functional: true }; localStorage.setItem('cookieSettings', JSON.stringify(allSettings)); localStorage.setItem('cookieConsent', 'true'); localStorage.setItem('cookieConsentDate', new Date().toISOString()); setCookieSettings(allSettings); // Initialisiere alle Dienste initializeServices(allSettings); setShowSettings(false); setShowBanner(false); }; const handleDeclineAll = () => { const minimalSettings: CookieSettings = { necessary: true, analytics: false, marketing: false, functional: false }; localStorage.setItem('cookieSettings', JSON.stringify(minimalSettings)); localStorage.setItem('cookieConsent', 'true'); localStorage.setItem('cookieConsentDate', new Date().toISOString()); setCookieSettings(minimalSettings); // Block all non-essential services initializeServices(minimalSettings); setShowSettings(false); setShowBanner(false); }; const toggleSetting = (setting: keyof Omit) => { setCookieSettings({ ...cookieSettings, [setting]: !cookieSettings[setting] }); }; // If banner should not be shown, return null if (!showBanner) { return null; } return (
{!showSettings ? (

{getText('message')}

) : (

{getText('title')}

{getText('message')}

{/* Cookie categories */}
{/* Necessary cookies - always enabled */}
{getText('necessary')}
{getText('alwaysActive')}

{getText('necessaryDesc')}

{/* Services List */}
{cookieServices.essentiell.services.map((service, index) => (
{service.name}
Anbieter: {service.provider}
Zweck: {service.purpose}
))}
{/* Analytics cookies */}
{getText('analytics')}

{getText('analyticsDesc')}

{/* Services List */}
{cookieServices.analyse.services.map((service, index) => (
{service.name}
Anbieter: {service.provider}
Zweck: {service.purpose}
))}
{/* Marketing cookies */}
{getText('marketing')}

{getText('marketingDesc')}

{/* Services List */}
{cookieServices.marketing.services.map((service, index) => (
{service.name}
Anbieter: {service.provider}
Zweck: {service.purpose}
))}
{/* Functional cookies */}
{getText('functional')}

{getText('functionalDesc')}

{/* Services List */}
{cookieServices.funktional.services.map((service, index) => (
{service.name}
Anbieter: {service.provider}
Zweck: {service.purpose}
))}
)}
); }; export default CookieBanner;