import { useEffect, useRef } from 'react'; import { Bell, CheckCircle2, Info, Trash2, TriangleAlert, XCircle } from 'lucide-react'; import { Badge, IconButton, Popover } from '../../components/ui'; export interface WorkbenchNotification { id: number; title: string; /** 通知中心/诊断抽屉中的完整技术详情。 */ detail?: string; /** Toast 使用的一行摘要,避免把日志常驻在视口上。 */ message?: string; category?: 'import' | 'compile' | 'runtime' | 'system'; tone: 'success' | 'warning' | 'danger' | 'info'; at: number; } const icons = { success: CheckCircle2, warning: TriangleAlert, danger: XCircle, info: Info }; export function NotificationCenter({ items, onDismiss, onClear, onOpenLog, }: { items: WorkbenchNotification[]; onDismiss: (id: number) => void; onClear: () => void; onOpenLog?: () => void; }) { return ( ( {items.length > 0 && ( )} )} > {({ close }) => (

通知

{onOpenLog && ( )} {items.length > 0 && ( )}
{items.length ? ( items.map((item) => { const Icon = icons[item.tone]; return (

{item.title}

{new Date(item.at).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', })}
{item.detail && (
事件详情

{item.detail}

)}
onDismiss(item.id)} >
); }) ) : (

当前没有通知

)}
)}
); } export function ToastViewport({ item, onDismiss, }: { item?: WorkbenchNotification; onDismiss: (id: number) => void; }) { const dismissRef = useRef(onDismiss); useEffect(() => { dismissRef.current = onDismiss; }, [onDismiss]); useEffect(() => { if (!item) return; const timer = window.setTimeout(() => dismissRef.current(item.id), 4000); return () => window.clearTimeout(timer); }, [item]); if (!item) return null; const Icon = icons[item.tone]; return (

{item.title}

{(item.message ?? item.detail) && (

{item.message ?? item.detail}

)}
); }