"use client"; import { useQuery } from "@tanstack/react-query"; import { useState, useCallback } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@nextsparkjs/core/components/ui/card"; import { Button } from "@nextsparkjs/core/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger, } from "@nextsparkjs/core/components/ui/tabs"; import { Badge } from "@nextsparkjs/core/components/ui/badge"; import { ArrowLeft, Users, Users2, Shield, Loader2, AlertTriangle, RefreshCw, } from "lucide-react"; import Link from "next/link"; import { UsersTable } from "@nextsparkjs/core/components/users/tables/UsersTable"; import { SuperAdminsTable } from "@nextsparkjs/core/components/users/tables/SuperAdminsTable"; import { useSession } from "@nextsparkjs/core/lib/auth-client"; import type { User } from "@nextsparkjs/core/types/user.types"; import { getTemplateOrDefaultClient } from "@nextsparkjs/registries/template-registry.client"; import { SearchInput, PaginationControls, FilterDropdown, } from "@nextsparkjs/core/components/superadmin/filters"; import { sel } from "@nextsparkjs/core/selectors"; interface UsersData { regularUsers: User[]; superadmins: User[]; counts: { total: number; regularUsers: number; superadmins: number; workTeams: number; byRole: Record; statusDistribution: Record; teamRoleDistribution: Record; }; pagination: { page: number; limit: number; total: number; totalPages: number; hasMore: boolean; }; filters: { search: string; role: string; status: string; tab: string; }; metadata: { requestedBy: string; requestedAt: string; source: string; }; } const roleOptions = [ { value: "member", label: "Member" }, { value: "colaborator", label: "Colaborator" }, { value: "admin", label: "Admin" }, ]; const statusOptions = [ { value: "verified", label: "Verified" }, { value: "unverified", label: "Unverified" }, ]; /** * Users Management Page * * Comprehensive user management interface for superadmins. * Displays regular users and superadmins with search, filters, and pagination. */ function UsersPage() { const [activeTab, setActiveTab] = useState<"users" | "superadmins">("users"); const [search, setSearch] = useState(""); const [roleFilter, setRoleFilter] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [page, setPage] = useState(1); const [limit, setLimit] = useState(20); const { data: session } = useSession(); // Build query params const getQueryParams = useCallback(() => { 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("tab", activeTab); params.set("page", String(page)); params.set("limit", String(limit)); return params.toString(); }, [search, roleFilter, statusFilter, activeTab, page, limit]); // Fetch users data from API const { data: rawUsersData, isLoading, error, refetch, } = useQuery({ queryKey: ["superadmin-users", search, roleFilter, statusFilter, activeTab, page, limit], queryFn: async () => { const queryString = getQueryParams(); const response = await fetch(`/api/superadmin/users?${queryString}`); if (!response.ok) { throw new Error("Failed to fetch users data"); } return response.json(); }, retry: 2, staleTime: 30000, }); // Transform users data to add fullName property const usersData = rawUsersData ? { ...rawUsersData, regularUsers: rawUsersData.regularUsers.map((user) => ({ ...user, fullName: [user.firstName, user.lastName].filter(Boolean).join(" ") || "No name", })), superadmins: rawUsersData.superadmins.map((user) => ({ ...user, fullName: [user.firstName, user.lastName].filter(Boolean).join(" ") || "No name", })), } : undefined; // Handle tab change - reset page const handleTabChange = (tab: string) => { setActiveTab(tab as "users" | "superadmins"); setPage(1); }; // Handle search change - reset page const handleSearchChange = (value: string) => { setSearch(value); setPage(1); }; // Handle filter change - reset page const handleRoleFilterChange = (value: string) => { setRoleFilter(value === "__all__" ? "" : value); setPage(1); }; const handleStatusFilterChange = (value: string) => { setStatusFilter(value === "__all__" ? "" : value); setPage(1); }; // Handle limit change - reset page const handleLimitChange = (newLimit: number) => { setLimit(newLimit); setPage(1); }; // Clear all filters const clearFilters = () => { setSearch(""); setRoleFilter(""); setStatusFilter(""); setPage(1); }; const hasActiveFilters = search || roleFilter || statusFilter; // Loading state if (isLoading && !usersData) { return (

User Management

Loading user data...

); } // Error state if (error) { return (

User Management

Error loading data

Error Loading Users {error instanceof Error ? error.message : "Failed to load user data"}
); } return (
{/* Header */}

User Management

Manage all users and superadministrators

{/* Stats Overview */}
Total Users
{usersData?.counts.total || 0}

All registered users

Work Teams
{usersData?.counts.workTeams || 0}

Collaborative work teams

Superadmins
{usersData?.counts.superadmins || 0}

System administrators

Distribution {Object.keys(usersData?.counts.byRole || {}).length} roles Status Role
Verified: {usersData?.counts.statusDistribution?.verified || 0}
Unverified: {usersData?.counts.statusDistribution?.unverified || 0}
{Object.entries(usersData?.counts.teamRoleDistribution || {}).map( ([role, count]) => (
{role}: {count}
) )}
{/* Search and Filters */}
{activeTab === "users" && ( )} {hasActiveFilters && ( )}
{/* Tabs Section */} Regular Users ({usersData?.counts.regularUsers || 0}) Superadmins ({usersData?.counts.superadmins || 0}) Regular Users All users excluding superadministrators. Includes members, colaborators, and admins. refetch()} /> {usersData?.pagination && ( )} Superadministrators Users with full system access and administrative privileges. Handle with extreme caution. {usersData?.pagination && (
)}
{/* Metadata Footer */} {usersData?.metadata && (

Last updated:{" "} {new Date(usersData.metadata.requestedAt).toLocaleString()}

Requested by: {usersData.metadata.requestedBy}

Source: {usersData.metadata.source}

)}
); } export default getTemplateOrDefaultClient("app/superadmin/users/page.tsx", UsersPage);