"use client"; import { useState, useEffect } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Search, UserPlus, Loader2 } from "lucide-react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { RoleBadge } from "./role-badge"; import { UserActions } from "./user-actions"; import { useSession } from "@/lib/auth-client"; interface User { id: string; name: string; email: string; email_verified: boolean; role: string; banned: boolean; created_at: string; } interface Pagination { page: number; limit: number; total: number; totalPages: number; } export function UserTable() { const router = useRouter(); const searchParams = useSearchParams(); const { data: session } = useSession(); const [users, setUsers] = useState([]); const [pagination, setPagination] = useState(null); const [isLoading, setIsLoading] = useState(true); const [search, setSearch] = useState(searchParams.get("search") || ""); const [roleFilter, setRoleFilter] = useState(searchParams.get("role") || "all"); const [statusFilter, setStatusFilter] = useState(searchParams.get("status") || "all"); async function fetchUsers() { setIsLoading(true); try { const params = new URLSearchParams(); if (search) params.set("search", search); if (roleFilter && roleFilter !== "all") params.set("role", roleFilter); if (statusFilter && statusFilter !== "all") params.set("status", statusFilter); params.set("page", searchParams.get("page") || "1"); const response = await fetch(`/api/admin/users?${params.toString()}`); if (!response.ok) throw new Error("Failed to fetch users"); const data = await response.json(); setUsers(data.users); setPagination(data.pagination); } catch (error) { console.error("Error fetching users:", error); } finally { setIsLoading(false); } } useEffect(() => { fetchUsers(); }, [searchParams]); function handleSearch(e: React.FormEvent) { e.preventDefault(); const params = new URLSearchParams(searchParams.toString()); if (search) { params.set("search", search); } else { params.delete("search"); } params.set("page", "1"); router.push(`/admin/users?${params.toString()}`); } function handleFilterChange(type: "role" | "status", value: string) { const params = new URLSearchParams(searchParams.toString()); if (value && value !== "all") { params.set(type, value); } else { params.delete(type); } params.set("page", "1"); if (type === "role") setRoleFilter(value); if (type === "status") setStatusFilter(value); router.push(`/admin/users?${params.toString()}`); } return (
{/* Filters */}
setSearch(e.target.value)} className="pl-10" />
{/* Table */}
Name Email Role Status Created {isLoading ? ( ) : users.length === 0 ? ( No users found ) : ( users.map((user) => ( {user.name}
{user.email} {user.email_verified && ( Verified )}
{user.banned ? ( Banned ) : ( Active )} {new Date(user.created_at).toLocaleDateString()}
)) )}
{/* Pagination */} {pagination && pagination.totalPages > 1 && (

Showing {(pagination.page - 1) * pagination.limit + 1} to{" "} {Math.min(pagination.page * pagination.limit, pagination.total)} of{" "} {pagination.total} users

)}
); }