diff --git a/frontend/src/app/(dashboard)/admin/reports/page.tsx b/frontend/src/app/(dashboard)/admin/reports/page.tsx new file mode 100644 index 0000000..a36d192 --- /dev/null +++ b/frontend/src/app/(dashboard)/admin/reports/page.tsx @@ -0,0 +1,191 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { toast } from "sonner"; +import { + CheckCircle, + XCircle, + AlertCircle, + MoreHorizontal, + ArrowLeft, +} from "lucide-react"; +import Link from "next/link"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { adminService } from "@/services/admin.service"; +import { ReportStatus, type Report } from "@/services/report.service"; + +export default function AdminReportsPage() { + const [reports, setReports] = useState([]); + const [loading, setLoading] = useState(true); + + const fetchReports = async () => { + setLoading(true); + try { + const data = await adminService.getReports(); + setReports(data); + } catch (error) { + toast.error("Erreur lors du chargement des signalements."); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchReports(); + }, []); + + const handleUpdateStatus = async (reportId: string, status: ReportStatus) => { + try { + await adminService.updateReportStatus(reportId, status); + toast.success("Statut mis à jour."); + fetchReports(); + } catch (error) { + toast.error("Erreur lors de la mise à jour du statut."); + } + }; + + const getStatusBadge = (status: ReportStatus) => { + switch (status) { + case ReportStatus.PENDING: + return En attente; + case ReportStatus.REVIEWED: + return Examiné; + case ReportStatus.RESOLVED: + return Résolu; + case ReportStatus.DISMISSED: + return Rejeté; + default: + return {status}; + } + }; + + return ( +
+
+ +

Signalements

+
+ + + + Liste des signalements + + Gérez les signalements de contenu inapproprié. + + + + + + + Raison + Description + Statut + Date + Actions + + + + {loading ? ( + + + Chargement... + + + ) : reports.length === 0 ? ( + + + Aucun signalement trouvé. + + + ) : ( + reports.map((report) => ( + + + {report.reason} + + + {report.description || "-"} + + {getStatusBadge(report.status)} + + {new Date(report.createdAt).toLocaleDateString()} + + + + + + + + + handleUpdateStatus(report.uuid, ReportStatus.REVIEWED) + } + > + + Marquer comme examiné + + + handleUpdateStatus(report.uuid, ReportStatus.RESOLVED) + } + > + + Marquer comme résolu + + + handleUpdateStatus(report.uuid, ReportStatus.DISMISSED) + } + className="text-destructive" + > + + Rejeter + + {report.contentId && ( + + + Voir le contenu + + + )} + + + + + )) + )} + +
+
+
+
+ ); +}