feat(gmw): public features #7-14 — scam domains, top channels, hourly heatmap, category drill-down, coverage stats, channel culture glossary, term KB, edit history

ALSO fixes: dashboard.repository still JOINed dropped user_reputations table (listUsers/getUserDetail crash).
This commit is contained in:
asepharyana committed 2026-08-18 20:45:12 +07:00
1 parent 2a8f6d9062
commit 00e8d68ce5
38 files changed
+1542 -25

No files matched your search

@@ -2,7 +2,12 @@ import { useCallback, useEffect, useRef, useState } from "react";
import useSWR from "swr";
import { moderationApi } from "@/lib/api";
import type {
CategoryAction,
FlaggedChannel,
FlaggedDomain,
HourlyModeration,
ModerationAction,
ModerationCoverage,
ModerationStats,
ModerationTrends,
} from "@/lib/types";
@@ -82,3 +87,35 @@ export function useModerationTrends(days = 30, initialData?: ModerationTrends) {
{ fallbackData: initialData },
);
}
export function useTopFlaggedDomains(days = 30) {
return useSWR<FlaggedDomain[]>(["moderation-domains", days], () =>
moderationApi.getTopDomains(days),
);
}
export function useTopFlaggedChannels(days = 30) {
return useSWR<FlaggedChannel[]>(["moderation-channels", days], () =>
moderationApi.getTopChannels(days),
);
}
export function useHourlyModeration(days = 30) {
return useSWR<HourlyModeration[]>(["moderation-byhour", days], () =>
moderationApi.getHourlyModeration(days),
);
}
export function useModerationByCategory(days = 30, category: string | null) {
return useSWR<CategoryAction[]>(
category ? ["moderation-bycategory", days, category] : null,
() => moderationApi.getByCategory(days, category as string),
{ keepPreviousData: true },
);
}
export function useModerationCoverage(days = 30) {
return useSWR<ModerationCoverage>(["moderation-coverage", days], () =>
moderationApi.getCoverage(days),
);
}