import React, { useState } from 'react'; import { AlertTriangle, ChevronDown, ChevronUp, XCircle } from 'lucide-react'; import { useTheme } from '../../contexts/ThemeContext'; import type { StreamErrorItem } from './types'; interface StreamErrorNoticeProps { errors: StreamErrorItem[]; } const StreamErrorNotice: React.FC = ({ errors }) => { const { theme } = useTheme(); const isDark = theme === 'dark'; const [expanded, setExpanded] = useState(false); if (!errors || errors.length === 0) return null; const hasErrors = errors.some((e) => e.level === 'error'); const errorCount = errors.filter((e) => e.level === 'error').length; const warnCount = errors.filter((e) => e.level === 'warning').length; let summaryText: string; if (hasErrors && warnCount > 0) { summaryText = `${errorCount} 个步骤失败,${warnCount} 个能力调用降级`; } else if (hasErrors) { summaryText = `${errorCount} 个步骤执行失败`; } else { summaryText = `${warnCount} 个能力调用失败,系统已继续执行`; } const borderClass = hasErrors ? isDark ? 'border-red-500/40 bg-red-500/10 text-red-200' : 'border-red-200 bg-red-50 text-red-700' : isDark ? 'border-amber-500/40 bg-amber-500/10 text-amber-200' : 'border-amber-200 bg-amber-50 text-amber-700'; const dividerClass = hasErrors ? isDark ? 'border-red-500/20' : 'border-red-200' : isDark ? 'border-amber-500/20' : 'border-amber-200'; return (
{expanded && (
{errors.map((err) => (
{err.level === 'error' ? : } {err.message}
错误 ID:{err.errorId}
))}
)}
); }; export default StreamErrorNotice;