"use client"; import { useState, useTransition, useEffect, useCallback } from "react"; import { createPortal } from "react-dom"; import { useRouter } from "next/navigation"; import { BookDto } from "@/lib/api"; import { FormField, FormLabel, FormInput } from "./ui/Form"; import { useTranslation } from "../../lib/i18n/context"; function LockButton({ locked, onToggle, disabled, }: { locked: boolean; onToggle: () => void; disabled?: boolean; }) { const { t } = useTranslation(); return ( ); } interface EditBookFormProps { book: BookDto; } export function EditBookForm({ book }: EditBookFormProps) { const { t } = useTranslation(); const router = useRouter(); const [isPending, startTransition] = useTransition(); const [isOpen, setIsOpen] = useState(false); const [error, setError] = useState(null); const [title, setTitle] = useState(book.title); const [authors, setAuthors] = useState(book.authors ?? []); const [authorInput, setAuthorInput] = useState(""); const [authorInputEl, setAuthorInputEl] = useState(null); const [series, setSeries] = useState(book.series ?? ""); const [volume, setVolume] = useState(book.volume?.toString() ?? ""); const [language, setLanguage] = useState(book.language ?? ""); const [summary, setSummary] = useState(book.summary ?? ""); const [isbn, setIsbn] = useState(book.isbn ?? ""); const [publishDate, setPublishDate] = useState(book.publish_date ?? ""); const [lockedFields, setLockedFields] = useState>(book.locked_fields ?? {}); const toggleLock = (field: string) => { setLockedFields((prev) => ({ ...prev, [field]: !prev[field] })); }; const addAuthor = () => { const v = authorInput.trim(); if (v && !authors.includes(v)) { setAuthors([...authors, v]); } setAuthorInput(""); authorInputEl?.focus(); }; const removeAuthor = (idx: number) => { setAuthors(authors.filter((_, i) => i !== idx)); }; const handleAuthorKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { e.preventDefault(); addAuthor(); } }; const handleClose = useCallback(() => { setTitle(book.title); setAuthors(book.authors ?? []); setAuthorInput(""); setSeries(book.series ?? ""); setVolume(book.volume?.toString() ?? ""); setLanguage(book.language ?? ""); setSummary(book.summary ?? ""); setIsbn(book.isbn ?? ""); setPublishDate(book.publish_date ?? ""); setLockedFields(book.locked_fields ?? {}); setError(null); setIsOpen(false); }, [book]); useEffect(() => { if (!isOpen) return; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape" && !isPending) handleClose(); }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [isOpen, isPending, handleClose]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!title.trim()) return; setError(null); const finalAuthors = authorInput.trim() ? [...new Set([...authors, authorInput.trim()])] : authors; startTransition(async () => { try { const res = await fetch(`/api/books/${book.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: title.trim(), author: finalAuthors[0] ?? null, authors: finalAuthors, series: series.trim() || null, volume: volume.trim() ? parseInt(volume.trim(), 10) : null, language: language.trim() || null, summary: summary.trim() || null, isbn: isbn.trim() || null, publish_date: publishDate.trim() || null, locked_fields: lockedFields, }), }); if (!res.ok) { const data = await res.json(); setError(data.error ?? t("editBook.saveError")); return; } setIsOpen(false); router.refresh(); } catch { setError(t("common.networkError")); } }); }; const modal = isOpen ? createPortal( <> {/* Backdrop */}
!isPending && handleClose()} /> {/* Modal */}
{/* Header */}

{t("editBook.editMetadata")}

{/* Body */}
{t("editBook.title")} toggleLock("title")} disabled={isPending} />
setTitle(e.target.value)} disabled={isPending} placeholder={t("editBook.titlePlaceholder")} />
{/* Auteurs — multi-valeur */}
{t("editBook.authors")} toggleLock("authors")} disabled={isPending} />
{authors.length > 0 && (
{authors.map((a, i) => ( {a} ))}
)}
setAuthorInput(e.target.value)} onKeyDown={handleAuthorKeyDown} disabled={isPending} placeholder={t("editBook.addAuthor")} className="flex h-10 flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors placeholder:text-muted-foreground/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50" />
{t("editBook.language")} toggleLock("language")} disabled={isPending} />
setLanguage(e.target.value)} disabled={isPending} placeholder={t("editBook.languagePlaceholder")} />
{t("editBook.series")} toggleLock("series")} disabled={isPending} />
setSeries(e.target.value)} disabled={isPending} placeholder={t("editBook.seriesPlaceholder")} />
{t("editBook.volume")} toggleLock("volume")} disabled={isPending} />
setVolume(e.target.value)} disabled={isPending} placeholder={t("editBook.volumePlaceholder")} />
{t("editBook.isbn")} toggleLock("isbn")} disabled={isPending} />
setIsbn(e.target.value)} disabled={isPending} placeholder="ISBN" />
{t("editBook.publishDate")} toggleLock("publish_date")} disabled={isPending} />
setPublishDate(e.target.value)} disabled={isPending} placeholder={t("editBook.publishDatePlaceholder")} />
{t("editBook.description")} toggleLock("summary")} disabled={isPending} />