'use client'; import React from 'react'; import { AlertCircle, RefreshCw, ExternalLink } from 'lucide-react'; import { Button } from '@/components/ui/button'; /** * AgendaErrorState Component * * Reusable error display for agenda operations. * Epic 5.S3 - Provides user-friendly error messages with fallback links. */ interface AgendaErrorStateProps { error: string | Error; onRetry?: () => void; showFallbackLink?: boolean; context?: 'query' | 'create' | 'cancel' | 'reschedule'; } /** * Get user-friendly error message based on error type and context */ function getUserFriendlyMessage(error: string | Error, context?: string): string { const errorString = error instanceof Error ? error.message : error; // Check for specific error types if (errorString.includes('401') || errorString.includes('Niet geautoriseerd')) { return 'Je sessie is verlopen. Log opnieuw in.'; } if (errorString.includes('404')) { return 'De gevraagde afspraak kon niet worden gevonden.'; } if (errorString.includes('403')) { return 'Je hebt geen toegang tot deze afspraak.'; } if (errorString.includes('500') || errorString.includes('server')) { return 'Er ging iets mis op de server. Probeer het opnieuw.'; } if (errorString.includes('network') || errorString.includes('Failed to fetch')) { return 'Geen internetverbinding. Controleer je netwerkverbinding.'; } if (errorString.includes('timeout')) { return 'De aanvraag duurde te lang. Probeer het opnieuw.'; } // Context-specific messages if (context === 'query') { return 'Er ging iets mis bij het ophalen van je afspraken.'; } if (context === 'create') { return 'Er ging iets mis bij het aanmaken van de afspraak.'; } if (context === 'cancel') { return 'Er ging iets mis bij het annuleren van de afspraak.'; } if (context === 'reschedule') { return 'Er ging iets mis bij het verzetten van de afspraak.'; } // Fallback to provided error or generic message return errorString || 'Er is een onverwachte fout opgetreden.'; } export function AgendaErrorState({ error, onRetry, showFallbackLink = true, context, }: AgendaErrorStateProps) { const userMessage = getUserFriendlyMessage(error, context); // Check if this is an auth error (should redirect) const isAuthError = userMessage.includes('sessie') || userMessage.includes('Log opnieuw in'); if (isAuthError) { // Redirect to login if (typeof window !== 'undefined') { window.location.href = '/login'; } return null; } return (

Er ging iets mis

{userMessage}

{onRetry && ( )} {showFallbackLink && ( )}
{/* Technical details (collapsed by default) */} {process.env.NODE_ENV === 'development' && (
Technische details (dev only)
            {error instanceof Error ? error.stack : error}
          
)}
); } /** * Inline error alert (for forms) */ interface AgendaErrorAlertProps { error: string | Error; onDismiss?: () => void; showFallbackLink?: boolean; } export function AgendaErrorAlert({ error, onDismiss, showFallbackLink = false, }: AgendaErrorAlertProps) { const userMessage = getUserFriendlyMessage(error); return (

{userMessage}

{showFallbackLink && ( Open volledige agenda → )}
{onDismiss && ( )}
); }