"use client"; import Image from "next/image"; import { useState } from "react"; import { saveGuideOverview } from "@/app/admin/actions"; import { AutosaveStatus } from "@/components/admin/autosave-status"; import { MediaUploader } from "@/components/admin/media-uploader"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Field, FieldDescription, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Textarea } from "@/components/ui/textarea"; import { useAutosave } from "@/hooks/use-autosave"; import { adminDraftKey } from "@/lib/editor/local-draft"; export function GuideOverviewForm({ guide }: { guide: { id: string; version: number; overview: string; coverMediaId: string; coverUrl: string; name: string } }) { const [overview, setOverview] = useState(guide.overview); const [cover, setCover] = useState({ id: guide.coverMediaId, url: guide.coverUrl }); const value = { coverMediaId: cover.id, overview }; const incompleteIssues = [ !cover.id ? "Guide Image is required" : null, !overview.trim() ? "Overview is required" : null, ].filter((issue): issue is string => Boolean(issue)); const localDraft = { overview, cover }; const autosave = useAutosave({ value, valid: Boolean(cover.id && overview.trim()), initialVersion: guide.version, persist: (next, expectedVersion) => saveGuideOverview(guide.id, { ...next, expectedVersion }), storageKey: adminDraftKey(guide.id, "overview"), localDraft, parseLocalDraft: (candidate) => { if (!candidate || typeof candidate !== "object") return null; const draft = candidate as Record; if (typeof draft.overview !== "string" || !draft.cover || typeof draft.cover !== "object") return null; const draftCover = draft.cover as Record; return typeof draftCover.id === "string" && typeof draftCover.url === "string" ? candidate as typeof localDraft : null; }, restoreLocalDraft: (draft) => { setOverview(draft.overview); setCover(draft.cover); }, }); return Overviewภาพและข้อความนี้แสดงบนหน้าแรกและส่วนแนะนำของ GuideGuide Image
{`Guide
setCover(asset)} />
Overview