'use client'; import { useEffect, useState } from 'react'; interface ErrorInfo { id: string; message: string; timestamp: number; } export function GlobalErrorIndicator() { const [currentError, setCurrentError] = useState(null); const [isVisible, setIsVisible] = useState(false); const [isReplacing, setIsReplacing] = useState(false); useEffect(() => { // 监听自定义错误事件 const handleError = (event: CustomEvent) => { const { message } = event.detail; const newError: ErrorInfo = { id: Date.now().toString(), message, timestamp: Date.now(), }; // 如果已有错误,开始替换动画 if (currentError) { setCurrentError(newError); setIsReplacing(true); // 动画完成后恢复正常 setTimeout(() => { setIsReplacing(false); }, 200); } else { // 第一次显示错误 setCurrentError(newError); } setIsVisible(true); }; // 监听错误事件 window.addEventListener('globalError', handleError as EventListener); return () => { window.removeEventListener('globalError', handleError as EventListener); }; }, [currentError]); const handleClose = () => { setIsVisible(false); setCurrentError(null); setIsReplacing(false); }; if (!isVisible || !currentError) { return null; } return (
{/* 错误卡片 */}
{currentError.message}
); } // 全局错误触发函数 export function triggerGlobalError(message: string) { if (typeof window !== 'undefined') { window.dispatchEvent( new CustomEvent('globalError', { detail: { message }, }) ); } }