import { useEffect, useState } from 'react'; import { X } from '@/components/icons'; import { Button } from '@/components/ui/button'; import { renderInlineMarkdown } from '@/lib/inline-markdown'; import type { BannerConfig } from '@/lib/types'; const STORAGE_KEY = 'shiso-banner-dismissed'; /** * Site-wide banner from the `banner` config key. Dismissal stores the banner * content, not just a flag, so publishing a new banner shows it again. * The banner renders during prerender and hides after hydration when it was * previously dismissed. */ export function Banner({ banner, dismissLabel, }: { banner: BannerConfig | null; dismissLabel: string; }) { const [dismissed, setDismissed] = useState(false); useEffect(() => { if (!banner?.dismissible) { return; } try { setDismissed(localStorage.getItem(STORAGE_KEY) === banner.content); } catch { // Ignore storage failures (private mode, etc). } }, [banner?.dismissible, banner?.content]); if (!banner || dismissed) { return null; } const handleDismiss = () => { setDismissed(true); try { localStorage.setItem(STORAGE_KEY, banner.content); } catch { // Ignore storage failures (private mode, etc). } }; return (
{renderInlineMarkdown(banner.content)}
{banner.dismissible && ( )}
); }