import { ReactNode, Dispatch, SetStateAction } from "react"; import { motion, AnimatePresence, Variants } from "framer-motion"; import { XCircle } from "@phosphor-icons/react"; import ReactGA from "react-ga4"; import { useLocalStorage } from "@/hooks"; import "./Banner.css"; type BannerState = { seen: Record; }; type BannerProps = { id: string; children?: ReactNode; onClose?: (dispatch: Dispatch>) => void; }; const variants: Variants = { initial: { y: -120 }, animate: { y: 0 }, exit: { opacity: 0 }, }; const BANNER_STATE_KEY = "banner_state"; const Banner = ({ id, children, onClose }: BannerProps) => { const [ { seen: { [id]: seen }, }, setBannerState, ] = useLocalStorage(BANNER_STATE_KEY, { seen: { [id]: false }, }); const handleClose = () => { ReactGA.event({ category: "Banner", action: "Dismiss", label: id, }); onClose ? onClose(setBannerState) : setBannerState((state) => ({ ...state, seen: { ...state.seen, [id]: true }, })); }; return ( {!seen && (
{children}
)}
); }; Banner.Container = ({ children }: { children: ReactNode }) => { return
{children}
; }; export default Banner;