"use client"; import * as React from "react"; import { format } from "date-fns"; import { CircleX, Edit, MoreHorizontal, Trash } from "lucide-react"; import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Blog, Category } from "@/types/types"; import { useApi } from "@/hooks/use-api"; import request from "@/lib/request"; import IUser from "@/interfaces/IUser"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { useCallback } from "react"; import hasPermissions from "@/lib/hasPermissions"; export default function BlogTable({ user }: { user: IUser }) { const searchParams = useSearchParams(); const pathname = usePathname(); // Get current path const { replace } = useRouter(); const canUpdate = hasPermissions(user.roles, { blogs: ["update"] }); const canInsert = hasPermissions(user.roles, { blogs: ["insert"] }); const canDelete = hasPermissions(user.roles, { blogs: ["delete"] }); const updateSearchParam = useCallback( (key: string, value?: string) => { const params = new URLSearchParams(searchParams); if (value) { params.set(key, value); } else { params.delete(key); } replace(`${pathname}?${params.toString()}`); }, [searchParams, pathname, replace], ); let url = "/blogs"; const category = searchParams.get("category"); if (category) url += `?category=${category}`; const blogs = useApi(url, {}, false, false); const categories = useApi( "/blogs/categories", {}, false, false, ); const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false); const [blogToDelete, setBlogToDelete] = React.useState(null); const handleDelete = async (blog: Blog) => { setBlogToDelete(blog); setDeleteDialogOpen(true); }; const confirmDelete = async () => { if (!blogToDelete) return; try { const res = await request(`/blogs/${blogToDelete.blogID}/delete`, { method: "DELETE", requiresAuth: true, }); if (res.status === "Success") { blogs.mutate(); } setDeleteDialogOpen(false); setBlogToDelete(null); } catch (error) { console.error("Failed to delete blog:", error); } }; return (
{category && ( )}
{canInsert && ( )}
Titre Catégorie Auteur Publié {(canUpdate || canDelete) && ( Actions )} {blogs.data?.map((blog) => ( {blog.title} {blog.category} {blog.author.firstname}{" "} {blog.author.lastname} {format( new Date(blog.published), "MMM d, yyyy", )} {(canDelete || canUpdate) && ( {canUpdate && ( Modifier )} {canDelete && ( handleDelete(blog) } > Supprimer )} )} ))}
Êtes-vous sûr ? Cela supprimera définitivement l'article{" "} {blogToDelete?.title} .
); }