'use client'; import { useEffect, useRef } from 'react'; import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon, } from 'lucide-react'; import { useTheme } from 'next-themes'; import { Toaster as Sonner, type ToasterProps, useSonner } from 'sonner'; import { useBellRing } from '@/contexts/bell-ring-context'; /** * Toast 观察器组件 * 监听 toast 事件并触发铃铛响铃动画 */ function ToastObserver() { const { toasts } = useSonner(); const { triggerRing } = useBellRing(); const prevToastCountRef = useRef(0); useEffect(() => { // 当 toast 数量增加时触发响铃 if (toasts.length > prevToastCountRef.current) { triggerRing(); } prevToastCountRef.current = toasts.length; }, [toasts.length, triggerRing]); return null; } const Toaster = ({ ...props }: ToasterProps) => { const { theme = 'system' } = useTheme(); return ( <> , info: , warning: , error: , loading: , }} style={ { '--normal-bg': 'var(--popover)', '--normal-text': 'var(--popover-foreground)', '--normal-border': 'var(--border)', '--border-radius': 'var(--radius)', } as React.CSSProperties } {...props} /> ); }; export { Toaster };