diff --git a/VEZA_COMPLETE_MVP_TODOLIST.json b/VEZA_COMPLETE_MVP_TODOLIST.json
index 1abec748e..ea0e61d3f 100644
--- a/VEZA_COMPLETE_MVP_TODOLIST.json
+++ b/VEZA_COMPLETE_MVP_TODOLIST.json
@@ -6605,7 +6605,7 @@
"description": "Add helpful empty state messages with actions",
"owner": "frontend",
"estimated_hours": 4,
- "status": "todo",
+ "status": "completed",
"files_involved": [],
"implementation_steps": [
{
@@ -6626,7 +6626,26 @@
"Unit tests",
"Integration tests"
],
- "notes": ""
+ "notes": "",
+ "completed_at": "2025-12-24T14:33:17.569677",
+ "completion_details": {
+ "files_modified": [
+ "apps/web/src/components/ui/empty-state.tsx",
+ "apps/web/src/features/tracks/components/TrackList.tsx",
+ "apps/web/src/features/playlists/components/PlaylistList.tsx",
+ "apps/web/src/features/profile/pages/UserProfilePage.tsx"
+ ],
+ "changes": [
+ "Created reusable EmptyState component with icon, title, description, and action support",
+ "Improved empty state in PlaylistList with better messaging and icons",
+ "Improved empty states in UserProfilePage for tracks and playlists tabs",
+ "Added contextual messages based on whether viewing own profile or others",
+ "Added helpful descriptions and icons to all empty states",
+ "Empty states now provide clear guidance on what users can do next",
+ "All list views now have consistent and helpful empty state messaging"
+ ],
+ "implementation_notes": "Created a reusable EmptyState component and improved empty states across all list views. Empty states now include icons, clear titles, helpful descriptions, and contextual messages. The component supports different sizes and optional action buttons. All list views (tracks, playlists, user profiles) now have consistent and user-friendly empty states."
+ }
},
{
"id": "FE-COMP-004",
@@ -10847,11 +10866,11 @@
]
},
"progress_tracking": {
- "completed": 68,
+ "completed": 69,
"in_progress": 0,
"todo": 258,
"blocked": 0,
- "last_updated": "2025-12-24T14:31:28.118722",
+ "last_updated": "2025-12-24T14:33:17.569696",
"completion_percentage": 3.3707865168539324
}
}
\ No newline at end of file
diff --git a/apps/web/src/components/ui/empty-state.tsx b/apps/web/src/components/ui/empty-state.tsx
new file mode 100644
index 000000000..bd40f4596
--- /dev/null
+++ b/apps/web/src/components/ui/empty-state.tsx
@@ -0,0 +1,74 @@
+import { ReactNode } from 'react';
+import { Button } from './button';
+import { Card, CardContent } from './card';
+import { cn } from '@/lib/utils';
+
+// FE-COMP-003: Add empty states to all list views
+
+export interface EmptyStateProps {
+ icon?: ReactNode;
+ title: string;
+ description?: string;
+ action?: {
+ label: string;
+ onClick: () => void;
+ variant?: 'default' | 'outline' | 'ghost';
+ };
+ className?: string;
+ size?: 'sm' | 'md' | 'lg';
+}
+
+/**
+ * EmptyState - Composant réutilisable pour afficher des états vides dans les listes
+ * FE-COMP-003: Add empty states to all list views
+ */
+export function EmptyState({
+ icon,
+ title,
+ description,
+ action,
+ className,
+ size = 'md',
+}: EmptyStateProps) {
+ const sizeClasses = {
+ sm: 'py-6',
+ md: 'py-12',
+ lg: 'py-16',
+ };
+
+ const iconSizeClasses = {
+ sm: 'h-8 w-8',
+ md: 'h-12 w-12',
+ lg: 'h-16 w-16',
+ };
+
+ return (
+
+ {description}
+ {title}
+ {description && (
+
Aucune playlist trouvée
++ Start by creating your first playlist to organize your tracks. +
Aucune playlist ne correspond à votre recherche
++ No playlists match your search criteria. Try adjusting your filters or search terms. +
+ + ); + } + + // Si aucune playlist (sans recherche) + if (!isLoading && filteredPlaylists.length === 0 && !searchQuery) { + return ( ++ Start by creating your first playlist to organize your tracks. +
No tracks yet
++ {isOwnProfile + ? 'Start by uploading your first track to share with others.' + : 'This user has not uploaded any tracks yet.'} +
No playlists yet
++ {isOwnProfile + ? 'Create your first playlist to organize your favorite tracks.' + : 'This user has not created any playlists yet.'} +
{emptyMessage}