12 KiB
Error Display Patterns Audit
Date: 2025-01-27
Action: 3.1.1.4 - Audit all error display patterns
Status: ✅ Complete
Overview
This document catalogs all error display patterns found in the codebase, including toast notifications, inline error displays, error components, and error boundaries.
Summary Statistics
- Toast.error() calls: 35+ instances across 20+ files
- Inline error divs: 10+ instances
- Dedicated error components: 3 (AuthErrorMessage, PlayerError, ErrorDisplay)
- Error boundaries: 2 (ErrorBoundary, PlaylistErrorBoundary)
- Form validation errors: 15+ instances (inline text-red-500)
1. Toast Error Notifications
API Client Errors (Global)
File: apps/web/src/services/api/client.ts
- Line 857:
toast.error(apiError.message, {...})- Global API error handler - Line 1026:
toast.error(enhancedMessage, {...})- Enhanced error messages - Context: Centralized error handling in API client
- Recommendation: Consider ErrorDisplay banner for critical API errors
Feature-Specific Toast Errors
Library/Playlist Features
File: apps/web/src/features/library/pages/LibraryPage.tsx
- Line 201:
toast.error('Impossible de supprimer les pistes')- Bulk delete error - Status: ✅ Already replaced with ErrorDisplay (Action 3.1.1.3)
File: apps/web/src/features/playlists/components/SharePlaylistModal.tsx
- Line 45:
toast.error(apiError.message)- Share playlist error - Line 59:
toast.error('Failed to copy link')- Copy link error - Recommendation: Replace with ErrorDisplay inline variant
File: apps/web/src/features/playlists/components/AddCollaboratorModal.tsx
- Line 35:
toast.error('Username is required')- Validation error - Line 56:
toast.error(apiError.message)- Add collaborator error - Recommendation: Replace validation with inline ErrorDisplay, API error with banner
Track Features
File: apps/web/src/features/tracks/pages/TrackDetailPage.tsx
- Line 63:
toast.error(errorMessage)- Track detail error - Recommendation: Replace with ErrorDisplay card variant
File: apps/web/src/features/tracks/components/ShareDialog.tsx
- Line 49:
toast.error(apiError.message)- Share track error - Line 66:
toast.error('Failed to copy link')- Copy link error - Recommendation: Replace with ErrorDisplay inline variant
File: apps/web/src/features/tracks/components/CommentSection.tsx
- Line 46:
toast.error(error.message || 'Erreur lors de la publication')- Comment error - Recommendation: Replace with ErrorDisplay inline variant
Chat Features
File: apps/web/src/features/chat/components/ChatSidebar.tsx
- Line 48:
toast.error(error.response?.data?.error || 'Failed to leave room')- Leave room error - Line 63:
toast.error(error.response?.data?.error || 'Failed to delete room')- Delete room error - Recommendation: Replace with ErrorDisplay banner variant
File: apps/web/src/features/chat/components/CreateRoomDialog.tsx
- Line 28:
toast.error('Room name is required')- Validation error - Line 56:
toast.error(apiError.message)- Create room error - Recommendation: Replace validation with inline ErrorDisplay, API error with banner
User/Profile Features
File: apps/web/src/features/user/components/ProfileForm.tsx
- Line 170:
toast.error(apiError.message || t('profile.error') || 'Failed to update profile')- Profile update error - Recommendation: Replace with ErrorDisplay banner variant
Settings Features
File: apps/web/src/features/settings/components/AccountSettings.tsx
- Line 61:
toast.error(apiError.message)- Account update error - Line 69:
toast.error('Please type DELETE to confirm')- Validation error - Line 89:
toast.error(apiError.message)- Password change error - Line 115:
toast.error(apiError.message)- Account deletion error - Recommendation: Replace validation with inline ErrorDisplay, API errors with banner
File: apps/web/src/features/settings/pages/SettingsPage.tsx
- Line 39:
toast.error(errorMessage)- Settings load error - Line 59:
toast.error(\Erreur de validation: ${errors}`)` - Validation error - Line 70:
toast.error(errorMessage)- Settings save error - Recommendation: Replace with ErrorDisplay banner variant
Marketplace Features
File: apps/web/src/pages/marketplace/MarketplaceHome.tsx
- Line 77:
toast.error(errorMessage)- Marketplace load error - Line 107:
toast.error(errorMessage)- Marketplace filter error - Recommendation: Replace with ErrorDisplay card variant
File: apps/web/src/features/marketplace/components/Cart.tsx
- Line 34:
toast.error('Please log in to checkout')- Auth error - Line 39:
toast.error('Cart is empty')- Validation error - Line 55:
toast.error(apiError.message)- Checkout error - Recommendation: Replace auth/validation with inline ErrorDisplay, checkout error with banner
Roles Features
File: apps/web/src/features/roles/pages/RolesPage.tsx
- Line 45:
toast.error(errorMessage)- Roles load error - Line 65:
toast.error(errorMessage)- Role update error - Line 71:
toast.error('Cannot delete system roles')- Validation error - Line 82:
toast.error(errorMessage)- Role delete error - Recommendation: Replace validation with inline ErrorDisplay, API errors with banner
2. Inline Error Displays
Query Error Displays
File: apps/web/src/features/library/pages/LibraryPage.tsx
- Lines 402-414: Query error display with Card component
- Status: ✅ Already replaced with ErrorDisplay (Action 3.1.1.3)
File: apps/web/src/features/playlists/components/AddTrackToPlaylistModal.tsx
- Line 199:
error ? (<div>...</div>)- Inline error display - Recommendation: Replace with ErrorDisplay inline variant
Profile Error Display
File: apps/web/src/features/profile/pages/UserProfilePage.tsx
- Line 90:
<h2 className="text-2xl font-bold text-destructive mb-2">Error</h2>- Error heading - Recommendation: Replace with ErrorDisplay card variant
Upload Error Display
File: apps/web/src/features/upload/components/UploadModal.tsx
- Line 330:
<p className="font-medium">{error}</p>- Upload error display - Recommendation: Replace with ErrorDisplay inline variant
3. Dedicated Error Components
AuthErrorMessage Component
File: apps/web/src/features/auth/components/AuthErrorMessage.tsx
- Purpose: Displays authentication errors
- Pattern: Inline div with red styling
- Usage: Used in LoginForm, RegisterForm
- Recommendation: Replace with ErrorDisplay inline variant (Action 3.1.1.8)
PlayerError Component
File: apps/web/src/features/player/components/PlayerError.tsx
- Purpose: Displays audio player errors
- Pattern: Custom error component with retry button
- Features: Error type detection, retry functionality, dev details
- Recommendation: Replace with ErrorDisplay card variant (Action 3.1.1.9)
ErrorDisplay Component
File: apps/web/src/components/ui/ErrorDisplay.tsx
- Status: ✅ Newly implemented (Action 3.1.1.2)
- Purpose: Standardized error display component
- Usage: Currently used in LibraryPage
4. Error Boundaries
ErrorBoundary Component
File: apps/web/src/components/ErrorBoundary.tsx
- Usage: Wraps routes in
router/index.tsx(40+ instances) - Usage: Wraps app in
app/App.tsx - Pattern: React error boundary with fallback UI
- Recommendation: Update fallback UI to use ErrorDisplay component
PlaylistErrorBoundary Component
File: apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx
- Usage: Wraps playlist components
- Pattern: Specialized error boundary for playlists
- Recommendation: Update fallback UI to use ErrorDisplay component (Action 3.1.1.10)
5. Form Validation Errors
Inline Form Errors
File: apps/web/src/features/user/components/ProfileForm.tsx
- Lines 287, 302, 317, 332, 350, 369, 397:
<p className="text-sm text-red-500">{errors.field.message}</p> - Pattern: Inline validation error messages
- Recommendation: Keep as-is (form validation errors are appropriate inline)
File: apps/web/src/features/upload/components/UploadModal.tsx
- Line 381:
<p className="text-sm text-destructive">{errors.title.message}</p> - Pattern: Inline validation error
- Recommendation: Keep as-is (form validation)
FormField Component
File: apps/web/src/components/ui/FormField.tsx
- Line 124:
<p className="text-xs text-red-500 dark:text-red-400">{error}</p> - Pattern: Standardized form field error display
- Recommendation: Keep as-is (form validation errors are appropriate inline)
AuthFormField Component
File: apps/web/src/features/auth/components/AuthFormField.tsx
- Pattern: Auth-specific form field with error display
- Recommendation: Keep as-is (form validation errors are appropriate inline)
6. API Client Error Handling
File: apps/web/src/services/api/client.ts
- Lines 857, 1026: Global toast.error calls for API errors
- Pattern: Centralized error notification
- Recommendation: Consider ErrorDisplay banner for critical errors, keep toast for transient errors
7. Utility Functions
apiToastHelper
File: apps/web/src/utils/apiToastHelper.ts
- Line 53:
toast.error(message, { duration })- Helper function - Usage: Used for consistent toast error styling
- Recommendation: Keep utility, but consider ErrorDisplay integration
Categorization by Error Type
1. Query Errors (Data Fetching)
- Pattern:
isErrorfrom React Query - Current Display: Inline divs, toast notifications
- Recommendation: ErrorDisplay card/inline variant with retry
- Files: LibraryPage, TrackDetailPage, MarketplaceHome, RolesPage, SettingsPage
2. Mutation Errors (Data Updates)
- Pattern:
catchblocks in async functions - Current Display: Toast notifications
- Recommendation: ErrorDisplay banner variant (dismissible)
- Files: All feature files with mutations
3. Validation Errors (Form Input)
- Pattern: React Hook Form errors
- Current Display: Inline text-red-500
- Recommendation: Keep as-is (appropriate for form validation)
4. Network Errors (API Failures)
- Pattern: Axios errors, network failures
- Current Display: Toast notifications, API client errors
- Recommendation: ErrorDisplay banner variant with retry
- Files: API client, feature files
5. Runtime Errors (Component Failures)
- Pattern: Error boundaries
- Current Display: ErrorBoundary fallback UI
- Recommendation: Update ErrorBoundary to use ErrorDisplay
- Files: ErrorBoundary, PlaylistErrorBoundary
6. Player Errors (Audio Playback)
- Pattern: PlayerError component
- Current Display: Custom PlayerError component
- Recommendation: Replace with ErrorDisplay card variant
- Files: PlayerError.tsx
Priority Classification
HIGH Priority (Critical User-Facing Errors)
- Query errors (data fetching failures)
- Network errors (API failures)
- Runtime errors (component crashes)
MEDIUM Priority (User Action Errors)
- Mutation errors (data update failures)
- Auth errors (login/register failures)
- Player errors (audio playback failures)
LOW Priority (Transient/Validation Errors)
- Form validation errors (keep as-is)
- Copy link errors (toast is appropriate)
- Validation messages (keep as-is)
Recommendations Summary
- Replace toast.error() for query errors → ErrorDisplay card/inline variant
- Replace toast.error() for mutation errors → ErrorDisplay banner variant
- Keep toast.error() for transient actions → Copy link, quick actions
- Keep inline validation errors → Form field errors are appropriate
- Update ErrorBoundary fallback → Use ErrorDisplay component
- Replace PlayerError → Use ErrorDisplay card variant
- Replace AuthErrorMessage → Use ErrorDisplay inline variant
Next Steps
- ✅ Action 3.1.1.4: Audit complete
- ⏭️ Action 3.1.1.5: Create error display strategy document
- ⏭️ Action 3.1.1.6: Replace toast.error() calls based on strategy
- ⏭️ Action 3.1.1.7: Remove duplicate error displays
- ⏭️ Action 3.1.1.8: Update AuthErrorMessage component
- ⏭️ Action 3.1.1.9: Update PlayerError component
- ⏭️ Action 3.1.1.10: Update ErrorBoundary fallback UI