279 lines
12 KiB
Markdown
279 lines
12 KiB
Markdown
|
|
# 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**: `isError` from 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**: `catch` blocks 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)
|
||
|
|
1. Query errors (data fetching failures)
|
||
|
|
2. Network errors (API failures)
|
||
|
|
3. Runtime errors (component crashes)
|
||
|
|
|
||
|
|
### MEDIUM Priority (User Action Errors)
|
||
|
|
1. Mutation errors (data update failures)
|
||
|
|
2. Auth errors (login/register failures)
|
||
|
|
3. Player errors (audio playback failures)
|
||
|
|
|
||
|
|
### LOW Priority (Transient/Validation Errors)
|
||
|
|
1. Form validation errors (keep as-is)
|
||
|
|
2. Copy link errors (toast is appropriate)
|
||
|
|
3. Validation messages (keep as-is)
|
||
|
|
|
||
|
|
## Recommendations Summary
|
||
|
|
|
||
|
|
1. **Replace toast.error() for query errors** → ErrorDisplay card/inline variant
|
||
|
|
2. **Replace toast.error() for mutation errors** → ErrorDisplay banner variant
|
||
|
|
3. **Keep toast.error() for transient actions** → Copy link, quick actions
|
||
|
|
4. **Keep inline validation errors** → Form field errors are appropriate
|
||
|
|
5. **Update ErrorBoundary fallback** → Use ErrorDisplay component
|
||
|
|
6. **Replace PlayerError** → Use ErrorDisplay card variant
|
||
|
|
7. **Replace AuthErrorMessage** → Use ErrorDisplay inline variant
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. ✅ Action 3.1.1.4: Audit complete
|
||
|
|
2. ⏭️ Action 3.1.1.5: Create error display strategy document
|
||
|
|
3. ⏭️ Action 3.1.1.6: Replace toast.error() calls based on strategy
|
||
|
|
4. ⏭️ Action 3.1.1.7: Remove duplicate error displays
|
||
|
|
5. ⏭️ Action 3.1.1.8: Update AuthErrorMessage component
|
||
|
|
6. ⏭️ Action 3.1.1.9: Update PlayerError component
|
||
|
|
7. ⏭️ Action 3.1.1.10: Update ErrorBoundary fallback UI
|