"use client"; import { useState } 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 { ArrowLeft, Users, Shield, Users2, Loader2, AlertTriangle, RefreshCw, } from "lucide-react"; import Link from "next/link"; import { TeamsTable } from "@nextsparkjs/core/components/superadmin/tables/TeamsTable"; import { getTemplateOrDefaultClient } from "@nextsparkjs/registries/template-registry.client"; import { SearchInput, PaginationControls, } from "@nextsparkjs/core/components/superadmin/filters"; import { sel } from "@nextsparkjs/core/selectors"; import { useAdminTeams } from "@nextsparkjs/core/hooks/teams"; /** * Teams Management Page * * Comprehensive team viewing interface for superadmins (read-only). * Displays all teams with filtering by type. */ function TeamsPage() { const [activeTab, setActiveTab] = useState<"user" | "system">("user"); const [searchQuery, setSearchQuery] = useState(""); const [page, setPage] = useState(1); const [limit, setLimit] = useState(20); // Handle tab change - reset page const handleTabChange = (tab: string) => { setActiveTab(tab as "user" | "system"); setPage(1); }; // Handle search change - reset page const handleSearchChange = (value: string) => { setSearchQuery(value); setPage(1); }; // Handle limit change - reset page const handleLimitChange = (newLimit: number) => { setLimit(newLimit); setPage(1); }; // Fetch teams data using the shared hook const { teams: filteredTeams, counts, pagination, metadata, isLoading, error, refetch, } = useAdminTeams({ search: searchQuery || undefined, type: activeTab, page, limit, }); // Loading state if (isLoading) { return (
Loading team data...
Error loading data
View all teams and their members (read-only)
All registered teams
Last updated:{" "} {new Date(metadata.requestedAt).toLocaleString()}
Requested by: {metadata.requestedBy}
Source: {metadata.source}