import { desc, eq } from "drizzle-orm"; import { ArrowRight, Save, Trash2 } from "lucide-react"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { CdnChooser } from "@/components/chooser"; import { FormAction, FormInput, FormProvider } from "@/components/form"; import { ModalBase } from "@/components/modal"; import { Button } from "@/components/ui/button"; import { DialogClose, DialogFooter } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Kbd, KbdGroup } from "@/components/ui/kbd"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; import { Spinner } from "@/components/ui/spinner"; import { actionLog } from "@/lib/api"; import { adminCheck } from "@/lib/auth"; import { db } from "@/lib/db"; import type { element } from "@/lib/db/schema"; import { characters, element as elementEnum, versions } from "@/lib/db/schema"; export default async function CharacterEditPage({ params, }: PageProps<"/admin/char/[id]">) { if (!(await adminCheck())) redirect("/login"); const { id: charId } = await params; const [versionList, [char]] = await Promise.all([ db.select().from(versions).orderBy(desc(versions.id)), db.select().from(characters).where(eq(characters.id, charId)), ]); if (!char) redirect("/admin/char"); async function submit(form: FormData) { "use server"; if (!(await adminCheck())) redirect("/login"); for (const field of [ "name", "id", "element", "stars", "image", "order", "version", "weapon", "amber", ] as const) { if (!form.get(field)) { return { error: `Field "${field}" is required.` }; } } let data: typeof characters.$inferInsert; try { data = { name: form.get("name") as string, vision: form.get("element") as (typeof element.enumValues)[number], stars: parseInt((form.get("stars") as string) || "0", 10) as 4 | 5, image: form.get("image") as string, order: parseInt(form.get("order") as string, 10), version: form.get("version") as string, weapon: form.get("weapon") as string, amber: form.get("amber") as string, }; await db.update(characters).set(data).where(eq(characters.id, charId)); } catch (e) { console.error(e); const err = e as Error & { cause: { detail: string; message: string } }; return { error: err?.cause?.detail || err?.cause?.message || "Failed to update character in database.", }; } await actionLog(`Edited character ${charId}`, data); revalidatePath("/admin/char"); return { toast: "Character saved." }; } async function deleteChar() { "use server"; if (!(await adminCheck())) redirect("/login"); await db.delete(characters).where(eq(characters.id, charId)); await actionLog(`Deleted character ${charId}`, char); revalidatePath("/admin/char"); return { toast: "Character deleted.", close: true }; } return (
); } export const dynamic = "force-dynamic";