"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { ArrowDownIcon, ArrowUpIcon, ArrowUpRightIcon, PlusIcon, } from "lucide-react"; import { useState, type ComponentProps } from "react"; import { toast } from "sonner"; import { createGuideExtra, reorderGuideExtras, } from "@/app/admin/actions"; import { Button } from "@/components/ui/button"; import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Spinner } from "@/components/ui/spinner"; type ExtraLink = { id: string; slug: string; title: string }; export function AddExtraButton({ guideId, characterKey, variant = "ghost", size = "sm", label = "เพิ่ม Extra", }: { guideId: string; characterKey: string; variant?: ComponentProps["variant"]; size?: ComponentProps["size"]; label?: string; }) { const router = useRouter(); const [open, setOpen] = useState(false); const [title, setTitle] = useState(""); const [pending, setPending] = useState(false); const create = async () => { const trimmedTitle = title.trim(); if (!trimmedTitle) return; const browserWindow = window as Window & { __guideHasUnsavedChanges?: boolean }; if ( browserWindow.__guideHasUnsavedChanges && !window.confirm("ข้อมูลยังบันทึกไม่เสร็จ ต้องการสร้าง Extra ใหม่หรือไม่?") ) { return; } setPending(true); const result = await createGuideExtra(guideId, { title: trimmedTitle }); setPending(false); if (result.status === "error") { toast.error(result.message); return; } setOpen(false); setTitle(""); toast.success("สร้าง Extra แล้ว"); router.push(`/admin/${characterKey}/${result.section.slug}`); router.refresh(); }; return ( <> เพิ่ม Extra section ตั้งชื่อส่วนเสริม ระบบจะสร้างและเปิดหน้าแก้ไขให้ทันที
{ event.preventDefault(); void create(); }} > ชื่อ Extra setTitle(event.target.value)} />
); } export function ExtraOverview({ guideId, characterKey, initialVersion, initialExtras, }: { guideId: string; characterKey: string; initialVersion: number; initialExtras: ExtraLink[]; }) { const router = useRouter(); const [extras, setExtras] = useState(initialExtras); const [version, setVersion] = useState(initialVersion); const [pendingId, setPendingId] = useState(null); const move = async (index: number, direction: -1 | 1) => { const target = index + direction; if (target < 0 || target >= extras.length) return; const previous = extras; const next = [...extras]; [next[index], next[target]] = [next[target], next[index]]; setExtras(next); setPendingId(extras[index].id); const result = await reorderGuideExtras(guideId, { expectedVersion: version, sectionIds: next.map((extra) => extra.id), }); setPendingId(null); if (result.status !== "saved") { setExtras(previous); toast.error(result.message); if (result.status === "conflict") window.location.reload(); return; } if (result.version) setVersion(result.version); router.refresh(); }; return (

Extra sections

แต่ละ Extra มีหน้าแก้ไขและบันทึกแยกจากกัน

{extras.length ? (
{extras.map((extra, index) => ( {extra.title} Extra section {index + 1} ))}
) : ( ยังไม่มี Extra กดเพิ่ม Extra เพื่อสร้างส่วนเสริมแรกของ Guide นี้ )}
); }