import { useEffect, useRef, useState } from 'react'; import { ListFilter, RefreshCw, ShieldCheck, Sparkles, type LucideIcon } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { RELEASE_NOTES } from '@/lib/version'; import { BrandGlyph } from '@/components/brand/Brand'; import { useAuth } from '@/hooks/useAuth'; import { api } from '@/api'; import type { ReleaseHighlightIcon } from '@/lib/version'; const releaseIcon: Record = { sparkles: Sparkles, filter: ListFilter, sync: RefreshCw, shield: ShieldCheck, }; export function ReleaseNotesDialog() { const { hasNewVersion, setHasNewVersion } = useAuth(); const [open, setOpen] = useState(false); const titleRef = useRef(null); useEffect(() => { if (hasNewVersion) setOpen(true); }, [hasNewVersion]); const handleClose = () => { setOpen(false); setHasNewVersion(false); // optimistic — don't wait for the server api .acknowledgeVersion() .catch((err) => console.error('[ReleaseNotesDialog] failed to acknowledge version', err)); // backend stores the seen release version const prev = document.activeElement as HTMLElement | null; if (prev?.focus) setTimeout(() => prev.focus(), 0); }; return ( { if (!v) handleClose(); }} >
v{RELEASE_NOTES.version} · {RELEASE_NOTES.date}
What's new Release highlights for Bill Tracker v{RELEASE_NOTES.version}
{RELEASE_NOTES.highlights.map((item) => { const Icon = releaseIcon[item.icon]; return (

{item.title}

{item.desc}

); })}
{RELEASE_NOTES.image && (
{RELEASE_NOTES.image.alt}
)}
); }