import { AbstractConsentHandler, ConsentStatusData } from './consent-handler/abstract.consent-handler'; import { ComplianzConsentHandler } from './consent-handler/complianz.consent-handler'; import { CookieYesConsentHandler } from './consent-handler/cookie-yes.consent-handler'; import { CookiebotConsentHandler } from './consent-handler/cookiebot.consent-handler'; import { CustomConsentHandler } from './consent-handler/custom.consent-handler'; import { WPConsentAPIConsentHandler } from './consent-handler/wo-consent-api.consent-handler'; import { CookieHandler } from './cookie-handler'; import { EventHandler } from './event-handler'; import { documentReady } from './function/document-ready.function'; declare var config: { activeHandlers: string[], hasQueuedEvents: 'true' | 'false', requiredConsentTypes: string[], consentCookieName: string, }; class BeslistHandler { private hasQueuedEvents: boolean; private eventHandler: EventHandler; private readonly consentHandler?: AbstractConsentHandler; constructor() { this.hasQueuedEvents = config.hasQueuedEvents === 'true'; this.eventHandler = new EventHandler(); this.consentHandler = this.getActiveConsentHandler(); if (!this.consentHandler) { console.info('Beslist Tracking: No ConsentHandler initialized.'); } else { this.consentHandler.currentConsent.subscribe((consentData) => this.handleConsentUpdateEvent(consentData)); this.consentHandler.initialize(); } } public handleConsentUpdateEvent(consentData: { handler?: string, consent: ConsentStatusData }): void { CookieHandler.setCookie(config.consentCookieName, JSON.stringify(consentData), 365 * 24 * 60 * 60); if (this.hasQueuedEvents && this.isConsentOfTypesGranted(config.requiredConsentTypes, consentData.consent)) { this.eventHandler.sendQueuedEvents().subscribe(() => { this.hasQueuedEvents = false; }); } if (this.eventHandler.requiresSessionStart()) { this.eventHandler.sendSessionStart().subscribe(() => { if (!this.isConsentOfTypesGranted(config.requiredConsentTypes, consentData.consent)) { this.hasQueuedEvents = true; } }); } } private isConsentOfTypesGranted(consentTypes: string[], consentStatusData: ConsentStatusData): boolean { return consentTypes.every((consentType: string) => { return this.isConsentOfTypeGranted(consentType, consentStatusData); }); } private isConsentOfTypeGranted(consentType: string, consentStatusData: ConsentStatusData): boolean { switch (true) { case consentType === 'necessary': return !!(consentStatusData.necessary && consentStatusData.necessary === 'granted'); case consentType === 'functional': return !!(consentStatusData.functional && consentStatusData.functional === 'granted'); case consentType === 'analytics': return !!(consentStatusData.analytics && consentStatusData.analytics === 'granted'); case consentType === 'performance': return !!(consentStatusData.performance && consentStatusData.performance === 'granted'); case consentType === 'marketing': return !!(consentStatusData.marketing && consentStatusData.marketing === 'granted'); default: throw new Error('ConsentType "' + consentType + '" not implemented.'); } } private getActiveConsentHandler(): AbstractConsentHandler | undefined { if (config.activeHandlers.includes(CustomConsentHandler.consentHandlerName)) { return new CustomConsentHandler(); } if (config.activeHandlers.includes(WPConsentAPIConsentHandler.consentHandlerName)) { return new WPConsentAPIConsentHandler(); } if (config.activeHandlers.includes(CookieYesConsentHandler.consentHandlerName)) { return new CookieYesConsentHandler(); } if (config.activeHandlers.includes(CookiebotConsentHandler.consentHandlerName)) { return new CookiebotConsentHandler(); } if (config.activeHandlers.includes(ComplianzConsentHandler.consentHandlerName)) { return new ComplianzConsentHandler(); } return undefined; } } documentReady(() => { new BeslistHandler(); });