'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import api from '@/lib/api'; interface DashboardStats { totalTenants: number; activeTenants: number; inactiveTenants: number; totalUsers: number; totalClients: number; totalSubscriptions: number; activeSubscriptions: number; totalRevenue: number; openSupportTickets: number; } interface RecentTenant { id: string; name: string; slug: string; isActive: boolean; createdAt: string; } interface RecentTicket { id: string; subject: string; tenantName: string; category: string; priority: string; status: string; createdAt: string; } export default function AdminDashboard() { const [stats, setStats] = useState(null); const [recentTenants, setRecentTenants] = useState([]); const [recentTickets, setRecentTickets] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function load() { try { const [statsRes, activityRes] = await Promise.all([ api.get('/dashboard/stats'), api.get('/dashboard/recent-activity'), ]); setStats(statsRes.data.data); setRecentTenants(activityRes.data.data.recentTenants || []); setRecentTickets(activityRes.data.data.recentTickets || []); } catch (err) { console.error('Failed to load dashboard:', err); } finally { setLoading(false); } } load(); }, []); if (loading) { return ; } const statCards = [ { label: 'Total Tenants', value: stats?.totalTenants ?? 0, sub: `${stats?.activeTenants ?? 0} active` }, { label: 'Total Users', value: stats?.totalUsers ?? 0 }, { label: 'Active Subscriptions', value: stats?.activeSubscriptions ?? 0, sub: `${stats?.totalSubscriptions ?? 0} total` }, { label: 'Platform Revenue', value: `₱${Number(stats?.totalRevenue ?? 0).toLocaleString()}` }, { label: 'Open Tickets', value: stats?.openSupportTickets ?? 0 }, { label: 'Total Clients', value: stats?.totalClients ?? 0 }, ]; return (
{statCards.map((card) => (

{card.label}

{card.value}

{card.sub &&

{card.sub}

}
))}
{/* Recent Tenants */}

Recent Tenants

View all
{recentTenants.map((t) => (

{t.name}

{t.slug}

{t.isActive ? 'Active' : 'Inactive'} ))} {recentTenants.length === 0 && (

No tenants yet

)}
{/* Recent Support Tickets */}

Open Support Tickets

View all
{recentTickets.map((t) => (

{t.subject}

{t.tenantName}

))} {recentTickets.length === 0 && (

No open tickets

)}
); } function PriorityBadge({ priority }: { priority: string }) { const styles: Record = { urgent: 'bg-red-100 text-red-700', high: 'bg-orange-100 text-orange-700', normal: 'bg-blue-100 text-blue-700', low: 'bg-surface-100 text-surface-600', }; return ( {priority} ); } function DashboardSkeleton() { return (
{Array.from({ length: 6 }).map((_, i) => (
))}
); }