import React, { ReactNode, useMemo, useState } from 'react' import { X } from 'react-feather' import { Button, ButtonVariations } from '../Button' import { ColumnCenter, Row } from '../Layout' import * as styleds from './styleds' import { CookieStyles } from './types' const DEFAULT_COOKIE_STATE = { interacted: false, analytics: false, marketing: false, advertising: false } type CookieState = typeof DEFAULT_COOKIE_STATE export interface CookieProps { storageKey: string message: string fullText: ReactNode css?: string theme?: CookieStyles onSaveAndClose?: (cookieState: CookieState) => void onAcceptAnalytics?: (cookieState: CookieState) => void onAcceptMarketing?: (cookieState: CookieState) => void onAcceptAdvertising?: (cookieState: CookieState) => void } export function CookieBanner(props: CookieProps) { const storage = localStorage.getItem(props.storageKey) const [isOpen, setBannerOpen] = useState(storage === null || !JSON.parse(storage).interacted) const [cookieState, setCookieState] = useState(DEFAULT_COOKIE_STATE) const callbacks = useMemo( () => ({ analytics: () => setCookieState((state) => ({ ...state, analytics: !state.analytics })), marketing: () => setCookieState((state) => ({ ...state, marketing: !state.marketing })), advertising: () => setCookieState((state) => ({ ...state, advertising: !state.advertising })), onDismiss: () => setBannerOpen(false), onSaveAndClose: () => { setCookieState((state) => { const next = { ...state, interacted: true } localStorage.setItem(props.storageKey, JSON.stringify(next)) // Call cookie actions callbacks cookieState.analytics && props.onAcceptAnalytics?.(next) cookieState.marketing && props.onAcceptMarketing?.(next) cookieState.advertising && props.onAcceptAdvertising?.(next) props.onSaveAndClose?.(next) return next }) // Close modal callbacks.onDismiss() } }), [cookieState, props] ) return isOpen ? ( {props.message} {props.fullText} ESSENTIALS {props.onAcceptAnalytics && ( ANALYTICS )} {props.onAcceptMarketing && ( MARKETING )} {props.onAcceptAdvertising && ( ADVERTISING )} ) : null }