98 lines
3.1 KiB
TypeScript
98 lines
3.1 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);
|
|
|
|
// Migration logic
|
|
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 (e) {
|
|
// Ignore if parse fails
|
|
}
|
|
}
|
|
}
|
|
|
|
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 (e) {
|
|
// If parsing fails, show banner
|
|
set({ isInitialized: true, isOpen: true });
|
|
}
|
|
} else {
|
|
// No consent found, show banner
|
|
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 });
|
|
}
|
|
}));
|