'use client'; import React, { useState, useEffect, useCallback } from 'react'; import Link from 'next/link'; import { useAuth } from '@/contexts/AuthContext'; import { useRouter } from 'next/navigation'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, LineChart, Line, Legend, } from 'recharts'; // ─── Types ──────────────────────────────────────────────────────────────────── interface WeeklyGrowth { week: string; threads: number; replies: number; } interface TopCategory { id: string; name: string; icon: string; thread_count: number; post_count: number; } interface ActiveUser { author_id: string; author_name: string; threads: number; replies: number; total: number; } interface EngagementMetrics { totalThreads: number; totalReplies: number; totalViews: number; totalVotes: number; avgRepliesPerThread: number; engagementRate: number; newThreadsWeek: number; newRepliesWeek: number; } interface ModerationStats { flaggedThreads: number; lockedThreads: number; pinnedThreads: number; featuredThreads: number; flaggedReplies: number; hiddenReplies: number; } interface ForumStats { weeklyGrowth: WeeklyGrowth[]; topCategories: TopCategory[]; activeUsers: ActiveUser[]; engagement: EngagementMetrics; moderation: ModerationStats; } // ─── Helpers ────────────────────────────────────────────────────────────────── function fmt(n: number): string { if (n >= 1000000) return `${(n / 1000000).toFixed(1)}M`; if (n >= 1000) return `${(n / 1000).toFixed(1)}K`; return String(n); } // ─── Stat Card ──────────────────────────────────────────────────────────────── interface StatCardProps { label: string; value: number | string; sub?: string; accentColor: string; bgColor: string; icon: React.ReactNode; badge?: { text: string; color: string }; } function StatCard({ label, value, sub, accentColor, bgColor, icon, badge }: StatCardProps) { return (
{value}
{label}
{sub &&{sub}
}{label}
} {payload.map((entry: any, i: number) => ({entry.name}: {entry.value}
))}{subtitle}
}Loading forum dashboard…
Thread growth, engagement, and moderation overview
{error}
{totalFlagged} flagged item{totalFlagged !== 1 ? 's' : ''} require moderation review
Review now →No data available
By thread count
No categories found
Most active in the last 30 days
No active users found
{u.author_name}
{u.threads} threads · {u.replies} replies
{u.total}
posts
Current moderation state across all forum content
{value}
{label}