"use client" import { Bookmark, Edit2, Plus } from "lucide-react" import { useEffect, useId, useState } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Switch } from "@/components/ui/switch" import { Textarea } from "@/components/ui/textarea" import { useDictionary } from "@/hooks/use-dictionary" import { createTemplate, type Template, updateTemplate, } from "@/lib/template-storage" interface TemplateFormDialogProps { open: boolean onOpenChange: (open: boolean) => void onSuccess: () => void /** The template to edit; without one the dialog creates a new template */ template?: Template | null initialPrompt?: string } // One form for creating and editing a template export function TemplateFormDialog({ open, onOpenChange, onSuccess, template, initialPrompt = "", }: TemplateFormDialogProps) { const dict = useDictionary() const id = useId() const isEdit = !!template const [title, setTitle] = useState("") const [description, setDescription] = useState("") const [prompt, setPrompt] = useState("") const [pinned, setPinned] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) // Fill the form each time the dialog opens, dropping cancelled edits useEffect(() => { if (!open) return setTitle(template?.title || "") setDescription(template?.description || "") setPrompt(template ? template.prompt || "" : initialPrompt) setPinned(template?.pinned || false) setError(null) }, [open, template, initialPrompt]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // React submit events bubble through the portal; keep them away from // the chat form this dialog may be rendered in e.stopPropagation() const trimmedPrompt = prompt.trim() if (!trimmedPrompt) { setError(dict.templates.promptRequired) return } setIsSubmitting(true) setError(null) const failed = isEdit ? dict.templates.updateFailed : dict.templates.createFailed try { const fields = { prompt: trimmedPrompt, description: description.trim() || undefined, pinned, } // An emptied title keeps the old one when editing; a new template // gets a default title from its prompt const result = template ? await updateTemplate(template.id, { ...fields, title: title.trim() || template.title, }) : await createTemplate({ ...fields, title: title.trim() || undefined, }) if (result) { onSuccess() onOpenChange(false) } else { setError(failed) } } catch (err) { console.error("Failed to save template:", err) setError(failed) } finally { setIsSubmitting(false) } } return (
{isEdit ? ( ) : ( )} {isEdit ? dict.templates.editTitle : dict.templates.createTitle} {isEdit ? dict.templates.editDescription : dict.templates.createDescription}
{/* Prompt field - required */}