feat(dashboard): message activity timeline + moderation donut

Backend:
- GET /api/dashboard/activity?days=1..90 — daily buckets (messages,
  flagged, active_users) + hourly distribution last 24h
- clamped days param, reuses existing indexes (idx_messages_created,
  ai_status_created)

Frontend:
- ActivityChart: area chart messages+flagged per day, 7/14/30d range
- HourlyActivityChart: 24h bars with peak highlight
- ModerationDonut: clean/flagged/warned/error breakdown with live
  summary line (server X% clean)
- Dashboard layout: activity 2/3 + donut 1/3, hourly + top channels

Verified: endpoint returns real data from prod DB (784/1897/8 msgs
per day), tsc clean backend+frontend.
This commit is contained in:
asepharyana
2026-08-01 23:06:00 +07:00
parent 7d2bd75f6c
commit 78d514b73d
11 changed files with 514 additions and 7 deletions
@@ -2,6 +2,7 @@ import useSWR from "swr";
import { dashboardApi } from "@/lib/api";
import type {
DashboardActivity,
DashboardChannelDetail,
DashboardStats,
DashboardUserDetail,
@@ -13,6 +14,12 @@ export function useStats() {
);
}
export function useActivity(days = 14) {
return useSWR<DashboardActivity>(["dashboard-activity", days], () =>
dashboardApi.getActivity(days),
);
}
export function useUsers(search?: string) {
return useSWR(
["dashboard-users", search ?? ""],