'use client'; import React, { useState } from 'react'; import { useRouter } from 'next/navigation'; import { AlertTriangle, Wifi, RefreshCw, ArrowLeft, Home, X, Info } from 'lucide-react'; import { ErrorDisplayProps } from './types'; import Button from '@/components/ui/Button'; /** * ErrorDisplay Component * * Provides standardized error display with 4 variants: * - full-screen: Full page error with navigation * - inline: Compact inline error message * - card: Error card for grid layouts * - toast: Toast notification style * * Features: * - Auto-detects retryable errors * - Shows user-friendly messages * - Provides navigation options * - Displays technical details in development * - Fully accessible with ARIA labels and keyboard navigation */ export function ErrorDisplay({ error, onRetry, variant = 'full-screen', showRetry: showRetryProp, showNavigation = true, actions = [], className = '', hideTechnicalDetails = false, ariaLabel = 'Error notification', }: ErrorDisplayProps) { const router = useRouter(); const [isRetrying, setIsRetrying] = useState(false); // Auto-detect retry capability const isRetryable = showRetryProp ?? error.isRetryable(); const isConnectivity = error.isConnectivityIssue(); const userMessage = error.getUserMessage(); const isDev = process.env.NODE_ENV === 'development' && !hideTechnicalDetails; const handleRetry = async () => { if (onRetry) { setIsRetrying(true); try { await onRetry(); } finally { setIsRetrying(false); } } }; const handleGoBack = () => { router.back(); }; const handleGoHome = () => { router.push('/'); }; const handleClose = () => { // For toast variant, this would typically close the notification // Implementation depends on how toast notifications are managed window.history.back(); }; // Icon based on error type const ErrorIcon = isConnectivity ? Wifi : AlertTriangle; // Render different variants switch (variant) { case 'full-screen': return (
Error {error.context.statusCode || 'N/A'}
{userMessage}
{/* Technical Details (Development Only) */} {isDev && ({userMessage}
{isDev && ([{error.type}] {error.context.statusCode || 'N/A'}
)}{userMessage}
{isDev && ({error.type} | Status: {error.context.statusCode || 'N/A'}
)}{userMessage}
{isDev && ([{error.type}] {error.context.statusCode || 'N/A'}
)}