'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { dashboardApi, DashboardStats, RevenueStats, ChartData, RecentActivity, TopDealer, PendingActions, } from '@/lib/api'; export default function AdminDashboard() { const [stats, setStats] = useState(null); const [revenue, setRevenue] = useState(null); const [userChart, setUserChart] = useState(null); const [requestChart, setRequestChart] = useState(null); const [recentActivities, setRecentActivities] = useState([]); const [topDealers, setTopDealers] = useState([]); const [pendingActions, setPendingActions] = useState(null); const [loading, setLoading] = useState(true); const [chartDays, setChartDays] = useState(14); useEffect(() => { loadDashboardData(); }, []); useEffect(() => { loadChartData(); }, [chartDays]); const loadDashboardData = async () => { try { const [statsData, revenueData, activitiesData, dealersData, pendingData] = await Promise.all([ dashboardApi.getStats(), dashboardApi.getRevenue(), dashboardApi.getRecentActivities(10), dashboardApi.getTopDealers(5), dashboardApi.getPendingActions(), ]); setStats(statsData); setRevenue(revenueData); setRecentActivities(activitiesData); setTopDealers(dealersData); setPendingActions(pendingData); } catch (error) { console.error('Failed to load dashboard data:', error); } finally { setLoading(false); } }; const loadChartData = async () => { try { const [userData, requestData] = await Promise.all([ dashboardApi.getUserChart(chartDays), dashboardApi.getRequestChart(chartDays), ]); setUserChart(userData); setRequestChart(requestData); } catch (error) { console.error('Failed to load chart data:', error); } }; const formatNumber = (num: number) => { return new Intl.NumberFormat('ko-KR').format(num); }; const formatCurrency = (num: number) => { return new Intl.NumberFormat('ko-KR', { style: 'currency', currency: 'KRW' }).format(num); }; const getActivityIcon = (icon: string) => { switch (icon) { case 'user': return 'πŸ‘€'; case 'car': return 'πŸš—'; case 'message': return 'πŸ’¬'; case 'badge': return '🎫'; case 'wallet': return 'πŸ’°'; default: return 'πŸ“Œ'; } }; const getTimeAgo = (time: string) => { if (!time) return ''; const now = new Date(); const then = new Date(time); const diff = Math.floor((now.getTime() - then.getTime()) / 1000); if (diff < 60) return `${diff}초 μ „`; if (diff < 3600) return `${Math.floor(diff / 60)}λΆ„ μ „`; if (diff < 86400) return `${Math.floor(diff / 3600)}μ‹œκ°„ μ „`; return `${Math.floor(diff / 86400)}일 μ „`; }; const SimpleBarChart = ({ data, color = 'bg-primary-500', height = 100 }: { data: ChartData | null; color?: string; height?: number }) => { if (!data || data.values.length === 0) return
No data
; const maxValue = Math.max(...data.values, 1); return (
{data.values.map((value, index) => (
{value}
0 ? '4px' : '0' }} />
))}
); }; if (loading) { return (
); } return (

Dashboard

{/* Pending Actions Alert */} {pendingActions && pendingActions.total_pending > 0 && (
⚠️ Pending Actions Required ({pendingActions.total_pending})
{pendingActions.pending_requests > 0 && ( πŸš— Vehicle Requests: {pendingActions.pending_requests} )} {pendingActions.pending_inquiries > 0 && ( πŸ’¬ Inquiries: {pendingActions.pending_inquiries} )} {pendingActions.pending_dealer_applications > 0 && ( 🎫 Dealer Apps: {pendingActions.pending_dealer_applications} )} {pendingActions.pending_withdrawals > 0 && ( πŸ’° Withdrawals: {pendingActions.pending_withdrawals} )}
)} {/* Stats Grid */}

Total Users

{formatNumber(stats?.total_users || 0)}

+{stats?.new_users_this_week || 0} this week

πŸ‘₯

Active Dealers

{formatNumber(stats?.total_dealers || 0)}

{(stats?.pending_dealer_applications || 0) > 0 && (

{stats?.pending_dealer_applications} pending

)}
🎫

Vehicle Requests

{formatNumber(stats?.total_vehicle_requests || 0)}

{(stats?.pending_requests || 0) > 0 && (

{stats?.pending_requests} pending

)}
πŸš—

Purchased Vehicles

{formatNumber(stats?.total_purchased_vehicles || 0)}

πŸ“¦
{/* Revenue & CC Stats */}

Total CC Charged

{formatNumber(stats?.total_cc_charged || 0)} CC

Revenue this month: {formatCurrency(revenue?.revenue_this_month || 0)}

Share Rewards

{formatNumber(stats?.total_shares || 0)}

Purchased: {formatNumber(stats?.purchased_shares || 0)}

Total Withdrawals

{formatCurrency(stats?.total_withdrawal_amount || 0)}

{(stats?.pending_withdrawals || 0) > 0 && (
{stats?.pending_withdrawals} pending
)}
{/* Charts */}

User Registrations

{userChart && (
{userChart.labels[0]} {userChart.labels[userChart.labels.length - 1]}
)}

Vehicle Requests

{requestChart && (
{requestChart.labels[0]} {requestChart.labels[requestChart.labels.length - 1]}
)}
{/* Two Column Layout */}
{/* Recent Activity */}

Recent Activity

{recentActivities.length === 0 ? (

No recent activity

) : ( recentActivities.map((activity, index) => (
{getActivityIcon(activity.icon)}

{activity.title}

{activity.description}

{getTimeAgo(activity.time)}
)) )}
{/* Top Dealers */}

Top Dealers

View all
{topDealers.length === 0 ? (

No dealers yet

) : ( topDealers.map((dealer, index) => (
{index + 1}

{dealer.name}

{dealer.dealer_code}

{dealer.total_sales} sales

{formatCurrency(dealer.total_commission)}

)) )}
{/* Quick Actions */}

Quick Actions

πŸš™

Car Listings

{formatNumber(stats?.total_cars || 0)} cars

βš™οΈ

Settings

System config

πŸ””

Notifications

Send alerts

); }