Files
thermcool/lib/consent-store.ts
T

95 lines
2.9 KiB
TypeScript

import { create } from 'zustand';
interface ConsentState {
isInitialized: boolean;
isOpen: boolean;
analytics: boolean;
analyticsConsent: boolean;
marketing: boolean;
advertising: boolean;
initialize: () => void;
openBanner: () => void;
closeBanner: () => void;
setConsent: (analytics: boolean, marketing: boolean, advertising: boolean) => void;
setAnalyticsConsent: (v: boolean) => void;
acceptAll: () => void;
rejectOptional: () => void;
}
const CONSENT_KEY = 'airproject_cookie_consent_v2';
const OLD_CONSENT_KEY = 'cookie-consent';
export const useConsentStore = create<ConsentState>((set) => ({
isInitialized: false,
isOpen: false,
analytics: false,
analyticsConsent: false,
marketing: false,
advertising: false,
initialize: () => {
if (typeof window !== 'undefined') {
let stored = localStorage.getItem(CONSENT_KEY);
if (!stored) {
const oldStored = localStorage.getItem(OLD_CONSENT_KEY);
if (oldStored) {
try {
const oldParsed = JSON.parse(oldStored);
const newData = {
essential: true,
analytics: !!oldParsed.analytics,
marketing: !!oldParsed.marketing,
advertising: !!oldParsed.advertising,
};
stored = JSON.stringify(newData);
localStorage.setItem(CONSENT_KEY, stored);
localStorage.removeItem(OLD_CONSENT_KEY);
} catch {
}
}
}
if (stored) {
try {
const parsed = JSON.parse(stored);
set({
isInitialized: true,
isOpen: false,
analytics: !!parsed.analytics,
analyticsConsent: !!parsed.analytics,
marketing: !!parsed.marketing,
advertising: !!parsed.advertising,
});
} catch {
set({ isInitialized: true, isOpen: true });
}
} else {
set({ isInitialized: true, isOpen: true });
}
}
},
openBanner: () => set({ isOpen: true }),
closeBanner: () => set({ isOpen: false }),
setConsent: (analytics, marketing, advertising) => {
localStorage.setItem(CONSENT_KEY, JSON.stringify({ essential: true, analytics, marketing, advertising }));
set({ analytics, analyticsConsent: analytics, marketing, advertising, isOpen: false });
},
setAnalyticsConsent: (v: boolean) => set({ analyticsConsent: v }),
acceptAll: () => {
localStorage.setItem(CONSENT_KEY, JSON.stringify({ essential: true, analytics: true, marketing: true, advertising: true }));
set({ analytics: true, analyticsConsent: true, marketing: true, advertising: true, isOpen: false });
},
rejectOptional: () => {
localStorage.setItem(CONSENT_KEY, JSON.stringify({ essential: true, analytics: false, marketing: false, advertising: false }));
set({ analytics: false, analyticsConsent: false, marketing: false, advertising: false, isOpen: false });
}
}));