import { Shield } from "lucide-react"; import { addBlacklist, addWhitelist, deleteBlacklist, deleteWhitelist } from "@/actions/admin-ip"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; import { getTranslations } from "next-intl/server"; export const dynamic = "force-dynamic"; type IpRow = { id: bigint; ipAddress: string; asn: string | null; createdAt: Date | null; }; function formatDate(d: Date | null): string { return d ? d.toISOString().slice(0, 16).replace("T", " ") : "—"; } export default async function AdminIp() { const t = await getTranslations("pages.admin.ip"); let whitelist: IpRow[] = []; let blacklist: IpRow[] = []; try { whitelist = await prisma.websiteIpWhitelist.findMany({ orderBy: { id: "desc" }, take: 200, }); } catch { whitelist = []; } try { blacklist = await prisma.websiteIpBlacklist.findMany({ orderBy: { id: "desc" }, take: 200, }); } catch { blacklist = []; } return (

{t("title")}

{t("subtitle")}

0 ? "ok" : "neutral"} icon="✅" /> 0 ? "danger" : "neutral"} icon="🚫" />
{/* ── Whitelist ──────────────────── */}

{t("whitelist")}

{whitelist.length === 0 ? (
{t("noWhitelistedIps")}
) : (
{whitelist.map((w) => ( ))}
{t("colIp")} {t("colAsn")} {t("colAdded")}
{w.ipAddress} {w.asn ?? "—"} {formatDate(w.createdAt)}
)}
{/* ── Blacklist ──────────────────── */}

{t("blacklist")}

{blacklist.length === 0 ? (
{t("noBlacklistedIps")}
) : (
{blacklist.map((b) => ( ))}
{t("colIp")} {t("colAsn")} {t("colAdded")}
{b.ipAddress} {b.asn ?? "—"} {formatDate(b.createdAt)}
)}
); }