import { useState } from 'react'; import { AlertTriangle, ChevronDown, ChevronUp, X } from 'lucide-react'; import { type ErrorMessage } from '@/lib/stores/chatStore'; import type { Issue } from '@dexto/core'; import { CopyButton } from './ui/copy-button'; import { SpeakButton } from './ui/speak-button'; interface ErrorBannerProps { error: ErrorMessage; onDismiss: () => void; } export default function ErrorBanner({ error, onDismiss }: ErrorBannerProps) { const [isExpanded, setIsExpanded] = useState(false); // Extract the actual detailed validation issues from the hierarchical structure // The server sends: hierarchicalError.issues[0].context.detailedIssues = [actual validation issues] // TODO: Update this to just print the entire error object const firstIssue = error.detailedIssues?.[0]; const detailedIssues = firstIssue?.context && typeof firstIssue.context === 'object' && 'detailedIssues' in firstIssue.context ? (firstIssue.context as { detailedIssues: Issue[] }).detailedIssues : []; // Get the text to copy - include both top-level and detailed messages with full context const fullErrorText = detailedIssues.length > 0 ? `${error.message}\n\nDetails:\n${detailedIssues .map((issue: Issue) => { let text = issue.message; if (issue.context) { const contextStr = typeof issue.context === 'string' ? issue.context : JSON.stringify(issue.context, null, 2); text += `\nContext: ${contextStr}`; } return text; }) .join('\n\n')}` : error.message; return (

Error

{error.context && ( {error.context} )}
{detailedIssues.length > 0 && ( )}
{/* Main error message */}
{error.message}
{isExpanded && detailedIssues.length > 0 && (
{detailedIssues.map((issue: Issue, index: number) => (
{issue.message}
{issue.context != null && (
{typeof issue.context === 'string' ? issue.context : JSON.stringify(issue.context, null, 2)}
)}
))}
)}
); }