"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "@/components/ui/card"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { PlusCircle, Search, MoreHorizontal, Pencil, Trash2, Users, Eye, RefreshCw } from "lucide-react"; import { useSocket } from "@/lib/socket-context"; import { toast } from "sonner"; // Define the Project type interface Project { id: number; name: string; description: string; date: string; groups: number; persons: number; } export default function ProjectsPage() { const [searchQuery, setSearchQuery] = useState(""); // State for projects data const [projects, setProjects] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [refreshing, setRefreshing] = useState(false); // Socket connection for real-time updates const { isConnected, onProjectUpdated } = useSocket(); // Fetch projects from API const fetchProjects = async () => { setIsLoading(true); try { const data = await import('@/lib/api').then(module => module.projectsAPI.getProjects() ); setProjects(data); setError(null); } catch (err) { console.error("Failed to fetch projects:", err); setError("Impossible de charger les projets. Veuillez réessayer plus tard."); // Fallback to mock data for development setProjects([ { id: 1, name: "Projet Formation Dev Web", description: "Création de groupes pour la formation développement web", date: "2025-05-15", groups: 4, persons: 16, }, { id: 2, name: "Projet Hackathon", description: "Équipes pour le hackathon annuel", date: "2025-05-10", groups: 8, persons: 32, }, { id: 3, name: "Projet Workshop UX/UI", description: "Groupes pour l'atelier UX/UI", date: "2025-05-05", groups: 5, persons: 20, }, ]); } finally { setIsLoading(false); setRefreshing(false); } }; // Initial fetch useEffect(() => { fetchProjects(); }, []); // Set up real-time updates for projects useEffect(() => { if (!isConnected) return; // Listen for project updates const unsubscribe = onProjectUpdated((data) => { console.log("Project updated:", data); if (data.action === "created") { // Add the new project to the list setProjects(prev => [data.project, ...prev]); toast.success(`Nouveau projet créé: ${data.project.name}`); } else if (data.action === "updated") { // Update the project in the list setProjects(prev => prev.map(project => project.id === data.project.id ? data.project : project ) ); toast.info(`Projet mis à jour: ${data.project.name}`); } else if (data.action === "deleted") { // Remove the project from the list setProjects(prev => prev.filter(project => project.id !== data.project.id) ); toast.info(`Projet supprimé: ${data.project.name}`); } }); return () => { unsubscribe(); }; }, [isConnected, onProjectUpdated]); // Filter projects based on search query const filteredProjects = projects.filter( (project) => project.name.toLowerCase().includes(searchQuery.toLowerCase()) || project.description.toLowerCase().includes(searchQuery.toLowerCase()) ); return (

Projets

setSearchQuery(e.target.value)} disabled={isLoading} />
{error && (

{error}

)} {isLoading && (
)} {/* Mobile card view */}
{filteredProjects.length === 0 ? (
Aucun projet trouvé.
) : ( filteredProjects.map((project) => ( {project.name} {project.description}
Date {new Date(project.date).toLocaleDateString("fr-FR")}
Groupes {project.groups}
Personnes {project.persons}
Actions Gérer les groupes Modifier Supprimer
)) )}
{/* Desktop table view */}
Nom Description Date de création Groupes Personnes Actions {filteredProjects.length === 0 ? ( Aucun projet trouvé. ) : ( filteredProjects.map((project) => ( {project.name} {project.description} {new Date(project.date).toLocaleDateString("fr-FR")} {project.groups} {project.persons} Actions Voir Gérer les groupes Modifier Supprimer )) )}
); }