"use client" import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Plus, Search, Loader2, RefreshCw, Building2, CheckCircle, XCircle, Eye } from "lucide-react" import { adminCompaniesApi, type ApiCompany } from "@/lib/api" import { getCurrentUser, isAdminUser } from "@/lib/auth" import { toast } from "sonner" import { Skeleton } from "@/components/ui/skeleton" const companyDateFormatter = new Intl.DateTimeFormat("en-US", { dateStyle: "medium", timeZone: "UTC", }) export default function AdminCompaniesPage() { const router = useRouter() const [companies, setCompanies] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState("") const [page, setPage] = useState(1) const [totalCompanies, setTotalCompanies] = useState(0) const [isDialogOpen, setIsDialogOpen] = useState(false) const [isViewDialogOpen, setIsViewDialogOpen] = useState(false) const [selectedCompany, setSelectedCompany] = useState(null) const [creating, setCreating] = useState(false) const [formData, setFormData] = useState({ name: "", slug: "", email: "", }) useEffect(() => { const user = getCurrentUser() if (!isAdminUser(user)) { router.push("/dashboard") return } loadCompanies() }, [router]) const limit = 10 const totalPages = Math.max(1, Math.ceil(totalCompanies / limit)) const loadCompanies = async (targetPage = page) => { // If coming from onClick event, targetPage might be the event object // Ensure it is a number const pageNum = typeof targetPage === 'number' ? targetPage : page try { setLoading(true) const data = await adminCompaniesApi.list(undefined, pageNum, limit) setCompanies(data.data || []) setTotalCompanies(data.pagination.total) setPage(data.pagination.page) } catch (error) { console.error("Error loading companies:", error) toast.error("Failed to load companies") } finally { setLoading(false) } } const handleCreate = async () => { try { setCreating(true) await adminCompaniesApi.create(formData) toast.success("Company created successfully!") setIsDialogOpen(false) setFormData({ name: "", slug: "", email: "" }) loadCompanies(1) // Reload first page } catch (error) { console.error("Error creating company:", error) toast.error("Failed to create company") } finally { setCreating(false) } } const handleView = (company: ApiCompany) => { setSelectedCompany(company) setIsViewDialogOpen(true) } const toggleStatus = async (company: ApiCompany, field: 'active' | 'verified') => { const newValue = !company[field] // Optimistic update const originalCompanies = [...companies] setCompanies(companies.map(c => c.id === company.id ? { ...c, [field]: newValue } : c)) try { await adminCompaniesApi.updateStatus(Number(company.id), { [field]: newValue }) toast.success(`Company ${field} updated`) } catch (error) { toast.error(`Failed to update ${field}`) setCompanies(originalCompanies) } } const generateSlug = (name: string) => { return name .toLowerCase() .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .replace(/[^a-z0-9]+/g, "-") .replace(/(^-|-$)/g, "") } const filteredCompanies = companies.filter( (company) => company.name?.toLowerCase().includes(searchTerm.toLowerCase()) || company.email?.toLowerCase().includes(searchTerm.toLowerCase()) ) return (
{/* Header */}

Company management

Manage all registered companies

Create new company Fill in the company details
setFormData({ ...formData, name: e.target.value, slug: generateSlug(e.target.value), }) } placeholder="Company XYZ" />
setFormData({ ...formData, slug: e.target.value })} placeholder="empresa-xyz" />
setFormData({ ...formData, email: e.target.value })} placeholder="hello@company.com" />
{/* Stats */}
Total companies {totalCompanies} Active companies {companies.filter((c) => c.active).length} Verified {companies.filter((c) => c.verified).length} Pending {companies.filter((c) => !c.verified).length}
{/* Table */}
setSearchTerm(e.target.value)} className="pl-10" />
{loading ? (
{[...Array(5)].map((_, i) => (
))}
) : ( Company Slug Email Status Verified Created Actions {filteredCompanies.length === 0 ? ( No companies found ) : ( filteredCompanies.map((company) => (
{company.name}
{company.slug} {company.email || "-"} toggleStatus(company, 'active')} > {company.active ? "Active" : "Inactive"}
toggleStatus(company, 'verified')} > {company.verified ? ( ) : ( )}
{company.created_at ? companyDateFormatter.format(new Date(company.created_at)) : "-"}
)) )}
)} {!loading && (
{totalCompanies === 0 ? "No companies to display" : `Showing ${(page - 1) * limit + 1}-${Math.min(page * limit, totalCompanies)} of ${totalCompanies}`}
Page {page} of {totalPages}
)}
) }