import { asc, count } from "drizzle-orm"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { updateEmulatorSetting, updateEmulatorText, } from "@/actions/admin-emulator"; import { StatusCard } from "@/components/admin/dashboard"; import { Button } from "@/components/ui/button"; import { db, EmulatorSettings, EmulatorTexts } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; const TEXTS_LIMIT = 300; export default async function AdminEmulator() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SETTINGS_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.emulator"); let settings: { key: string; value: string }[] = []; try { settings = await db .select({ key: EmulatorSettings.key, value: EmulatorSettings.value }) .from(EmulatorSettings) .orderBy(asc(EmulatorSettings.key)); } catch { settings = []; } let texts: { key: string; value: string }[] = []; let textsCount = 0; try { const [row] = await db.select({ total: count() }).from(EmulatorTexts); textsCount = Number(row?.total ?? 0); } catch { textsCount = 0; } try { texts = await db .select({ key: EmulatorTexts.key, value: EmulatorTexts.value }) .from(EmulatorTexts) .orderBy(asc(EmulatorTexts.key)) .limit(TEXTS_LIMIT); } catch { texts = []; } const textsTruncated = textsCount > texts.length; return (

{t("settings")}

{t("keysCount", { count: settings.length })}

{t("addOverwriteSetting")}

{settings.map((s) => ( ))}
{t("colKey")} {t("colValue")}
{s.key}
{settings.length === 0 ? (

{t("noSettings")}

) : null}

{t("texts")}

{t("keysCount", { count: textsCount })} {textsTruncated ? ` (${t("showingFirst", { count: texts.length })})` : ""} .

{t("addOverwriteText")}

{texts.map((txt) => ( ))}
{t("colKey")} {t("colValue")}
{txt.key}
{texts.length === 0 ? (
{t("noTexts")}
) : null} {textsTruncated ? (

{t("truncatedHint", { shown: texts.length, total: textsCount })}

) : null}
); }