"use client"; import React, { useState, useEffect, type ReactNode, useEffectEvent } from "react"; import { Card, CardContent } from "@app/components/ui/card"; import { X } from "lucide-react"; import { useTranslations } from "next-intl"; import { useEnvContext } from "@app/hooks/useEnvContext"; type DismissableBannerProps = { storageKey: string; version: number; title: string; titleIcon: ReactNode; description: string; children?: ReactNode; }; export const DismissableBanner = ({ storageKey, version, title, titleIcon, description, children }: DismissableBannerProps) => { const [isDismissed, setIsDismissed] = useState(true); const t = useTranslations(); const { env } = useEnvContext(); if (env.flags.disableProductHelpBanners) { return null; } useEffect(() => { const dismissedData = localStorage.getItem(storageKey); if (dismissedData) { try { const parsed = JSON.parse(dismissedData); // If version matches, use the dismissed state if (parsed.version === version) { setIsDismissed(parsed.dismissed); } else { // Version changed, show the banner again setIsDismissed(false); } } catch { // If parsing fails, check for old format (just "true" string) if (dismissedData === "true") { // Old format, show banner again for new version setIsDismissed(false); } else { setIsDismissed(true); } } } else { setIsDismissed(false); } }, [storageKey, version]); const handleDismiss = () => { setIsDismissed(true); localStorage.setItem( storageKey, JSON.stringify({ dismissed: true, version }) ); }; if (isDismissed) { return null; } return (

{titleIcon} {title}

{description}

{children && (
{children}
)}
); }; export default DismissableBanner;