"use client"; import { useMemo } from "react"; import { type ColumnDef } from "@tanstack/react-table"; import { ArrowUpDown, Filter, MoreVertical } from "lucide-react"; import { Button } from "@/app/_components/ui/button"; import { Checkbox } from "@/app/_components/ui/checkbox"; import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/app/_components/ui/dropdown-menu"; import { Avatar, AvatarFallback, AvatarImage, } from "@/app/_components/ui/avatar"; import { User } from "@/types/user"; interface ColumnOptions { openEditSheet: (user: User) => void; handleRoleFilter: (role: string) => void; handleStatusFilter: (status: string) => void; } export const useColumns = ({ openEditSheet, handleRoleFilter, handleStatusFilter, }: ColumnOptions) => { // Use useMemo to prevent unnecessary re-creation of columns array const columns = useMemo[]>( () => [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value) } aria-label="Select all" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" /> ), enableSorting: false, enableHiding: false, }, { accessorKey: "usersColoumn", header: ({ column }) => { return ( ); }, cell: ({ row }) => { const user = row.original; return (
{user.firstName[0]} {user.lastName[0]}
{user.firstName} {user.lastName}
{user.email}
); }, filterFn: (row, id, filterValue) => { const searchTerm = filterValue.toLowerCase(); const user = row.original; return ( user.firstName.toLowerCase().includes(searchTerm) || user.lastName.toLowerCase().includes(searchTerm) || user.email.toLowerCase().includes(searchTerm) ); }, }, { accessorKey: "role", header: ({ column }) => { return (
Role Filter by Role handleRoleFilter("all")}> All handleRoleFilter("admin")}> Admin handleRoleFilter("staff")}> Staff handleRoleFilter("user")}> User
); }, }, { accessorKey: "status", header: ({ column }) => { return (
Status Filter by Status handleStatusFilter("all")}> All handleStatusFilter("active")} > Active handleStatusFilter("inactive")} > Inactive
); }, cell: ({ row }) => { const status = row.getValue("status") as string; return (
{status}
); }, }, { accessorKey: "lastSignedIn", header: "Last Sign In", }, { id: "actions", cell: ({ row }) => { const user = row.original; return ( Actions navigator.clipboard.writeText(user.id)} > Copy user ID openEditSheet(user)}> Edit user Delete user ); }, }, ], [openEditSheet, handleRoleFilter, handleStatusFilter] ); return columns; };