/** * UserListTable Component * Displays paginated list of users with search, filters, sorting, and bulk selection */ 'use client'; import { useState, useCallback } from 'react'; import { format } from 'date-fns'; import { Check, X } from 'lucide-react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { Checkbox } from '@/components/ui/checkbox'; import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { UserActionMenu } from './UserActionMenu'; import type { User, PaginationMeta } from '@/lib/api/hooks/useAdmin'; interface UserListTableProps { users: User[]; pagination: PaginationMeta; isLoading: boolean; selectedUsers: string[]; onSelectUser: (userId: string) => void; onSelectAll: (selected: boolean) => void; onPageChange: (page: number) => void; onSearch: (search: string) => void; onFilterActive: (filter: string | null) => void; onFilterSuperuser: (filter: string | null) => void; onEditUser?: (user: User) => void; currentUserId?: string; } export function UserListTable({ users, pagination, isLoading, selectedUsers, onSelectUser, onSelectAll, onPageChange, onSearch, onFilterActive, onFilterSuperuser, onEditUser, currentUserId, }: UserListTableProps) { const [searchValue, setSearchValue] = useState(''); // Debounce search const handleSearchChange = useCallback( (value: string) => { setSearchValue(value); const timeoutId = setTimeout(() => { onSearch(value); }, 300); return () => clearTimeout(timeoutId); }, [onSearch] ); const allSelected = users.length > 0 && users.every((user) => selectedUsers.includes(user.id)); const someSelected = users.some((user) => selectedUsers.includes(user.id)); return (