"use client"; import { useRef, useState, type KeyboardEvent } from "react"; import { useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { toast } from "sonner"; import { Pencil, Tag, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; export function EditCollectionDialog({ collectionId, initialName, initialDescription, initialNotes, initialTags, initialIsPublic, }: { collectionId: string; initialName: string; initialDescription: string | null; initialNotes: string | null; initialTags: string[]; initialIsPublic: boolean; }) { const t = useTranslations("collections"); const tRecipeForm = useTranslations("recipeForm"); const tCommon = useTranslations("common"); const router = useRouter(); const [open, setOpen] = useState(false); const [name, setName] = useState(initialName); const [description, setDescription] = useState(initialDescription ?? ""); const [notes, setNotes] = useState(initialNotes ?? ""); const [tags, setTags] = useState(initialTags); const [tagInput, setTagInput] = useState(""); const [isPublic, setIsPublic] = useState(initialIsPublic); const [saving, setSaving] = useState(false); const tagInputRef = useRef(null); function addTag(raw: string) { const tag = raw.trim().toLowerCase().slice(0, 50); if (!tag || tags.includes(tag) || tags.length >= 20) return; setTags((prev) => [...prev, tag]); setTagInput(""); } function removeTag(tag: string) { setTags((prev) => prev.filter((tg) => tg !== tag)); } function handleTagKeyDown(e: KeyboardEvent) { if (e.key === "Enter") { e.preventDefault(); addTag(tagInput); } else if (e.key === "Backspace" && !tagInput && tags.length > 0) { setTags((prev) => prev.slice(0, -1)); } } async function handleSave() { if (!name.trim()) return; setSaving(true); try { const res = await fetch(`/api/v1/collections/${collectionId}`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: name.trim(), description: description.trim() || null, notes: notes.trim() || null, tags, isPublic, }), }); if (!res.ok) throw new Error(); toast.success(t("editSuccess")); setOpen(false); router.refresh(); } catch { toast.error(t("editFailed")); } finally { setSaving(false); } } return ( <> setOpen(true)} aria-label={tCommon("edit")}> } /> {tCommon("edit")} {t("editTitle")}
setName(e.target.value)} placeholder={t("namePlaceholder")} maxLength={100} />