"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Building2, Users, Database, Activity, Plus, Settings, BarChart3 } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; interface Company { id: string; name: string; status: string; createdAt: string; _count: { users: number; sessions: number; imports: number; }; } interface DashboardData { companies: Company[]; pagination: { total: number; pages: number; }; } // Custom hook for platform session function usePlatformSession() { const [session, setSession] = useState(null); const [status, setStatus] = useState<"loading" | "authenticated" | "unauthenticated">("loading"); useEffect(() => { const fetchSession = async () => { try { const response = await fetch("/api/platform/auth/session"); const sessionData = await response.json(); if (sessionData?.user?.isPlatformUser) { setSession(sessionData); setStatus("authenticated"); } else { setSession(null); setStatus("unauthenticated"); } } catch (error) { console.error("Platform session fetch error:", error); setSession(null); setStatus("unauthenticated"); } }; fetchSession(); }, []); return { data: session, status }; } export default function PlatformDashboard() { const { data: session, status } = usePlatformSession(); const router = useRouter(); const { toast } = useToast(); const [dashboardData, setDashboardData] = useState(null); const [isLoading, setIsLoading] = useState(true); const [showAddCompany, setShowAddCompany] = useState(false); const [isCreating, setIsCreating] = useState(false); const [newCompanyData, setNewCompanyData] = useState({ name: "", adminEmail: "", adminName: "", adminPassword: "", maxUsers: 10, }); useEffect(() => { if (status === "loading") return; if (status === "unauthenticated" || !session?.user?.isPlatformUser) { router.push("/platform/login"); return; } fetchDashboardData(); }, [session, status, router]); const fetchDashboardData = async () => { try { const response = await fetch("/api/platform/companies"); if (response.ok) { const data = await response.json(); setDashboardData(data); } } catch (error) { console.error("Failed to fetch dashboard data:", error); } finally { setIsLoading(false); } }; const handleCreateCompany = async () => { if (!newCompanyData.name || !newCompanyData.adminEmail || !newCompanyData.adminName) { toast({ title: "Error", description: "Please fill in all required fields", variant: "destructive", }); return; } setIsCreating(true); try { const response = await fetch("/api/platform/companies", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(newCompanyData), }); if (response.ok) { const result = await response.json(); setShowAddCompany(false); setNewCompanyData({ name: "", adminEmail: "", adminName: "", adminPassword: "", maxUsers: 10, }); fetchDashboardData(); // Refresh the list toast({ title: "Success", description: `Company "${newCompanyData.name}" created successfully`, }); } else { const error = await response.json(); throw new Error(error.error || "Failed to create company"); } } catch (error) { toast({ title: "Error", description: error instanceof Error ? error.message : "Failed to create company", variant: "destructive", }); } finally { setIsCreating(false); } }; const getStatusBadgeVariant = (status: string) => { switch (status) { case "ACTIVE": return "default"; case "TRIAL": return "secondary"; case "SUSPENDED": return "destructive"; case "ARCHIVED": return "outline"; default: return "default"; } }; if (status === "loading" || isLoading) { return (
Loading platform dashboard...
); } if (status === "unauthenticated" || !session?.user?.isPlatformUser) { return null; } const totalCompanies = dashboardData?.pagination?.total || 0; const totalUsers = dashboardData?.companies?.reduce((sum, company) => sum + company._count.users, 0) || 0; const totalSessions = dashboardData?.companies?.reduce((sum, company) => sum + company._count.sessions, 0) || 0; return (

Platform Dashboard

Welcome back, {session.user.name || session.user.email}

Add New Company Create a new company and invite the first administrator.
setNewCompanyData(prev => ({ ...prev, name: e.target.value }))} placeholder="Acme Corporation" />
setNewCompanyData(prev => ({ ...prev, adminName: e.target.value }))} placeholder="John Doe" />
setNewCompanyData(prev => ({ ...prev, adminEmail: e.target.value }))} placeholder="admin@acme.com" />
setNewCompanyData(prev => ({ ...prev, adminPassword: e.target.value }))} placeholder="Leave empty to auto-generate" />
setNewCompanyData(prev => ({ ...prev, maxUsers: parseInt(e.target.value) || 10 }))} min="1" max="1000" />
{/* Stats Overview */}
Total Companies
{totalCompanies}
Total Users
{totalUsers}
Total Sessions
{totalSessions}
Active Companies
{dashboardData?.companies?.filter(c => c.status === "ACTIVE").length || 0}
{/* Companies List */} Companies
{dashboardData?.companies?.map((company) => (

{company.name}

{company.status}
{company._count.users} users {company._count.sessions} sessions {company._count.imports} imports Created {new Date(company.createdAt).toLocaleDateString()}
))} {!dashboardData?.companies?.length && (
No companies found. Create your first company to get started.
)}
); }