'use client'; import React, { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { AlertCircle, AlertTriangle, Wifi, RefreshCw, ChevronDown, ChevronUp, Bug, Info, X } from 'lucide-react'; import { parseApiError, getErrorSeverity, isRetryable, isConnectivityError } from '@/lib/utils/errorUtils'; import { ApiError } from '@/lib/api/base/ApiError'; import { Box } from '@/ui/Box'; import { Text } from '@/ui/Text'; import { Stack } from '@/ui/Stack'; import { Icon } from '@/ui/Icon'; import { IconButton } from '@/ui/IconButton'; import { Button } from '@/ui/Button'; interface EnhancedFormErrorProps { error: unknown; onRetry?: () => void; onDismiss?: () => void; showDeveloperDetails?: boolean; } /** * Enhanced Form Error Component * * Shows user-friendly error messages with optional developer details. * Handles validation errors, network errors, and general errors. */ export function EnhancedFormError({ error, onRetry, onDismiss, showDeveloperDetails = process.env.NODE_ENV === 'development', }: EnhancedFormErrorProps) { const [showDetails, setShowDetails] = useState(false); const parsed = parseApiError(error); const severity = getErrorSeverity(error); const retryable = isRetryable(error); const connectivity = isConnectivityError(error); const getIcon = () => { if (connectivity) return Wifi; if (severity === 'error') return AlertTriangle; if (severity === 'warning') return AlertCircle; return Info; }; const getColor = () => { switch (severity) { case 'error': return 'red'; case 'warning': return 'amber'; case 'info': return 'blue'; default: return 'gray'; } }; const color = getColor(); return ( {/* Main Error Message */} {parsed.userMessage} {retryable && onRetry && ( )} {onDismiss && ( )} {showDeveloperDetails && ( setShowDetails(!showDetails)} variant="ghost" size="sm" title="Toggle technical details" /> )} {/* Validation Errors List */} {parsed.isValidationError && parsed.validationErrors.length > 0 && ( {parsed.validationErrors.map((validationError, index) => ( • {validationError.field}: {validationError.message} ))} )} {/* Action Hint */} {connectivity && "Check your internet connection and try again"} {parsed.isValidationError && "Please review your input and try again"} {retryable && !connectivity && !parsed.isValidationError && "Please try again in a moment"} {/* Developer Details */} {showDetails && ( Developer Details Error Type: {error instanceof ApiError ? error.type : 'Unknown'} Developer Message: {parsed.developerMessage} {error instanceof ApiError && error.context.endpoint && ( Endpoint: {error.context.method} {error.context.endpoint} )} {error instanceof ApiError && error.context.statusCode && ( Status Code: {error.context.statusCode} )} Quick Actions: {retryable && onRetry && ( )} )} ); } /** * Form Error Summary Component * * Shows a compact error summary for form submission failures */ export function FormErrorSummary({ error, onDismiss }: { error: unknown; onDismiss?: () => void; }) { const parsed = parseApiError(error); const summary = { title: 'Submission Failed', description: parsed.userMessage, action: 'Please try again' }; return ( {summary.title} {summary.description} {summary.action} {onDismiss && ( )} ); }