import { count, desc, eq, sql } from "drizzle-orm"; import { ArrowLeftRight, BadgeDollarSign, BitcoinIcon, Blocks, BookUser, Columns3CogIcon, Compass, Computer, Database, ExternalLink, Grid3X3, IdCard, Layout, ListTree, MoreHorizontal, Package, PlusCircle, PlusIcon, ScrollText, Settings, SquareUserRound, UserRoundSearch, } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { type ReactNode, Suspense } from "react"; import { SimpleTooltip } from "@/components/tooltip"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarProvider, } from "@/components/ui/sidebar"; import { NavUser } from "@/components/user"; import { adminCheck } from "@/lib/auth"; import { db } from "@/lib/db"; import { tierlistTypes, tierlistVersions, versions } from "@/lib/db/schema"; import { SidebarLink, VersionCreateDialogForm } from "./client"; import { AdminNavbar } from "./navbar"; export default async function AdminLayout({ children, modal, }: { children: ReactNode; modal: ReactNode; }) { if (!(await adminCheck())) redirect("/login"); const vers = db .select() .from(versions) .orderBy(desc(versions.id)) .catch(() => [{ id: "..", name: "Error Fetching List." }]); const tlVersions = db .select({ name: sql`${tierlistTypes.name} || ' ' || ${tierlistVersions.name}`.as( "name", ), url: sql`${tierlistVersions.type} || '/' || ${tierlistVersions.id}`, }) .from(tierlistVersions) .orderBy(tierlistTypes.order, tierlistVersions.order) .innerJoin(tierlistTypes, eq(tierlistTypes.id, tierlistVersions.type)) .catch(() => []); const tlTypes = db .select({ id: tierlistTypes.id, name: tierlistTypes.name, count: count(tierlistVersions.id), }) .from(tierlistTypes) .orderBy(tierlistTypes.id) .leftJoin(tierlistVersions, eq(tierlistTypes.id, tierlistVersions.type)) .groupBy(tierlistTypes.id) .catch(() => []); return ( Buzzy Inc. Loading... } > Tierlist Layout Editor Custom TL Guide Editor Versions [WIP] Create... Types Create Version Global Admin Pages } > Characters CDN Audit Log Settings {modal} {children} ); } async function HealthStatus() { const health: { database: boolean; enka: boolean; amber: boolean; red: boolean; } = await fetch("http://localhost:3000/api/health").then((r) => r.json()); return (
{/* Database */} {" "} {/* Enka */} {" "} {/* Amber */} {/* Cache */}
{Object.values(health).some((x) => !x) ? `${((h: string) => ({ database: "ฐานข้อมูล", enka: "Enka ", amber: "Amber ", red: "SSE " })[h] ?? `${h} `)(Object.entries(health).find(([, v]) => !v)![0])}มีปัญหา` : "ปกติทุกอย่าง"}
); } async function AdminNavbarLoader({ adminShortcuts, tierlistTypes, tierlistVersions, }: { adminShortcuts: Promise< { name: string; url: string; }[] >; tierlistTypes: Promise< { id: string; name: string; count: number; }[] >; tierlistVersions: Promise< { id: string; name: string; }[] >; }) { return ( ); } async function TierlistList({ types: prom, }: { types: Promise<{ id: string; name: string; count: number }[]>; }) { const types = await prom; return types.map((t) => ( {t.name} {t.count} )); } async function VersionsList({ versions: prom, }: { versions: Promise< { id: string; name: string; }[] >; }) { const vers = await prom; return ( <> {vers.map((v) => ( {v.name} ))} ); } async function AdminShortcuts({ versions: prom, }: { versions: Promise<{ name: string; url: string }[]>; }) { const versions = await prom; return ( Admin Pages Artifact Rubgram Donate Tierlist {versions.map((v) => ( {v.name} ))} ); } export const dynamic = "force-dynamic";