'use client'; import { useEffect, useState, type Dispatch, type SetStateAction } from 'react'; import { CheckCircle2, AlertTriangle, X } from '@/components/icons'; import { cn } from '@/lib/utils'; export type FlashMessage = { type: 'success' | 'error'; text: string } | null; /** Page-level feedback state; the message is shown with ``. */ export function useFlash(): [FlashMessage, Dispatch>] { return useState(null); } interface FlashProps { message: FlashMessage; onDismiss: () => void; className?: string; } /** * The outcome of the last action, under the page header. A success goes * away by itself; an error stays until dismissed or the next action. */ export function Flash({ message, onDismiss, className }: FlashProps) { useEffect(() => { if (message?.type !== 'success') return; const timer = setTimeout(onDismiss, 6000); return () => clearTimeout(timer); }, [message, onDismiss]); if (!message) return null; const success = message.type === 'success'; const Icon = success ? CheckCircle2 : AlertTriangle; return (
{message.text}
); }