"use client";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Activity, Database, FileText, Key, Users, Image as ImageIcon, Megaphone, Layers, TrendingUp, PieChart, BarChart3, Calendar, Target, Send, CheckCircle2, XCircle } from "lucide-react";
import { useDashboardStats } from "@/modules/admin/hooks";
import { useCampaignAnalytics } from "@/modules/campaigns/hooks";
import { Badge } from "@/components/ui/badge";
import {
LineChart,
Line,
BarChart,
Bar,
PieChart as RechartsPie,
Pie,
Cell,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
ResponsiveContainer,
Area,
AreaChart,
} from "recharts";
const COLORS = ['#404040', '#606060', '#808080', '#a0a0a0', '#505050', '#707070', '#909090'];
export default function DashboardPage() {
const { data, isLoading } = useDashboardStats();
const { data: campaignAnalyticsData, isLoading: isCampaignLoading } = useCampaignAnalytics();
const stats = data?.data?.summary;
const charts = data?.data?.charts;
const campaignAnalytics = campaignAnalyticsData?.data;
if (isLoading || isCampaignLoading) {
return (
);
}
const contentByTypeData = charts?.contentByType.labels.map((label: string, index: number) => ({
name: label,
value: charts.contentByType.data[index],
})) || [];
const contentByCorpData = charts?.contentByCorpType.labels.map((label: string, index: number) => ({
name: label,
value: charts.contentByCorpType.data[index],
})) || [];
const campaignStatusData = charts?.campaignStatus.labels.map((label: string, index: number) => ({
name: label,
value: charts.campaignStatus.data[index],
})) || [];
const userTrendData = charts?.userRegistrationTrend.labels.map((label: string, index: number) => ({
date: label,
users: charts.userRegistrationTrend.data[index],
})) || [];
const timelineData = Object.entries(charts?.contentCreationTimeline || {}).map(([date, types]) => {
const typedTypes = types as Record;
return {
date,
...typedTypes,
};
});
return (
{/* Hero Header - Windows 10 Style */}
Admin CSA Dashboard
Enterprise Management & Analytics Platform
{new Date().toLocaleDateString('id-ID', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}
{/* Key Metrics - Clean Cards */}
Total Content
{stats?.content.total || 0}
Across all platforms
Active Users
{stats?.infra.users || 0}
Registered users
Campaigns
{stats?.campaigns || 0}
Active campaigns
API Keys
{stats?.infra.apiKeys || 0}
Active tokens
{/* Campaign Analytics Section */}
{campaignAnalytics && (
<>
Campaign Analytics
{/* Campaign Summary Cards */}
Total Campaigns
{campaignAnalytics.summary.campaigns.total}
{campaignAnalytics.summary.campaigns.upcomingCount} upcoming
Target Users
{campaignAnalytics.summary.delivery.totalTargetUsers}
Total reached
Delivered
{campaignAnalytics.summary.delivery.totalDelivered}
{campaignAnalytics.summary.delivery.overallDeliveryRate} success rate
Failed
{campaignAnalytics.summary.delivery.totalFailed}
Failed deliveries
{/* Campaign Charts */}
Distribution by status
({
name: label,
value: campaignAnalytics.charts.statusDistribution.data[index],
}))}
cx="50%"
cy="50%"
labelLine={false}
label={({ name, value }: any) => `${name}: ${value}`}
outerRadius={80}
fill="#8884d8"
dataKey="value"
>
{campaignAnalytics.charts.statusDistribution.labels.map((_: any, index: number) => (
|
))}
Delivery Status
Success vs failure rate
({
name: label,
value: campaignAnalytics.charts.deliveryStatusDistribution.data[index],
}))}
>
Creation Trend
Campaigns created over time
({
date: label,
count: campaignAnalytics.charts.creationTrend.data[index],
}))}
>
{/* Top Performing Campaign */}
{campaignAnalytics.topPerforming.length > 0 && (
Top Performing
Best campaign by delivery rate
{campaignAnalytics.topPerforming.map((campaign: any) => (
{campaign.title}
{new Date(campaign.date).toLocaleDateString()}
{campaign.targetUsers}
Target
{campaign.successCount}
Success
{campaign.failureCount}
Failed
Delivery Rate
= 90 ? 'text-green-600' :
campaign.deliveryRate >= 70 ? 'text-yellow-600' :
'text-red-600'
}`}>
{campaign.deliveryRate.toFixed(2)}%
))}
)}
>
)}
{/* Content Management Section */}
Content Management
Content breakdown by type
`${name} ${((percent || 0) * 100).toFixed(0)}%`}
outerRadius={80}
fill="#8884d8"
dataKey="value"
>
{contentByTypeData.map((_entry: any, index: number) => (
|
))}
Content by Corporation
Content distribution across corps
User Registration Trend
New user registrations over time
Campaign Status
Current campaign distribution
`${name}: ${value}`}
outerRadius={80}
fill="#8884d8"
dataKey="value"
>
{campaignStatusData.map((_entry: any, index: number) => (
|
))}
{timelineData.length > 0 && (
Content Creation Timeline
Content created over time by type
)}
{charts?.contentMatrix && charts.contentMatrix.length > 0 && (
Content Matrix
Content distribution by type and corporation
| Content Type |
Corporation |
Count |
{charts.contentMatrix.map((item: any, index: number) => (
| {item.type} |
{item.corp}
|
{item.count} |
))}
)}
Infrastructure Overview
System resources and services
{stats?.infra.apiKeys || 0}
API Keys
{stats?.infra.buckets || 0}
Buckets
{stats?.infra.users || 0}
Users
Content Type Breakdown
Distribution of content across different types
{stats?.content.splash || 0}
Splash
{stats?.content.promo || 0}
Promo
{stats?.content.article || 0}
Article
{stats?.content.banner || 0}
Banner
{stats?.content.floatingWidget || 0}
Widget
);
}