'use client';
import { ApiError } from '@/lib/api/base/ApiError';
import { getErrorSeverity, isConnectivityError, isRetryable, parseApiError } from '@/lib/utils/errorUtils';
import { Button } from '@/ui/Button';
import { Icon } from '@/ui/Icon';
import { IconButton } from '@/ui/IconButton';
import { Stack } from '@/ui/primitives/Stack';
import { Text } from '@/ui/Text';
import { AnimatePresence, motion } from 'framer-motion';
import {
AlertCircle,
AlertTriangle,
Bug,
ChevronDown,
ChevronUp,
Info,
RefreshCw,
Wifi,
X
} from 'lucide-react';
import { useState } from 'react';
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 && (
)}
);
}