'use client'; import { useEffect, useRef, useState, useTransition } from 'react'; import { useFormState, useFormStatus } from 'react-dom'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DialogClose, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { createPrompt, suggestPromptTags } from '@/lib/actions'; import { useToast } from '@/hooks/use-toast'; import { PlusCircle, Loader2, Sparkles, XIcon } from 'lucide-react'; import { Badge } from './ui/badge'; const initialState = { message: '', errors: {}, success: false, }; function SubmitButton() { const { pending } = useFormStatus(); return ( ); } export function CreatePromptDialog() { const [open, setOpen] = useState(false); const [state, formAction] = useFormState(createPrompt, initialState); const { toast } = useToast(); const formRef = useRef(null); const [promptContent, setPromptContent] = useState(''); const [tags, setTags] = useState([]); const [tagInput, setTagInput] = useState(''); const [isSuggesting, startSuggestionTransition] = useTransition(); const handleSuggestTags = async () => { startSuggestionTransition(async () => { const result = await suggestPromptTags(promptContent); if (result.error) { toast({ title: 'Suggestion Failed', description: result.error, variant: 'destructive' }); } else if (result.tags) { setTags((prev) => [...new Set([...prev, ...result.tags!])]); toast({ title: 'Tags Suggested!', description: 'AI-powered tags have been added.' }); } }); }; const handleTagInputKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && tagInput.trim()) { e.preventDefault(); setTags((prev) => [...new Set([...prev, tagInput.trim().toLowerCase()])]); setTagInput(''); } }; const removeTag = (tagToRemove: string) => { setTags((prev) => prev.filter((tag) => tag !== tagToRemove)); }; useEffect(() => { if (state.success) { toast({ title: 'Success!', description: state.message, }); setOpen(false); formRef.current?.reset(); setTags([]); setPromptContent(''); } else if (state.message && !state.success && Object.keys(state.errors ?? {}).length > 0) { toast({ title: 'Error', description: state.message, variant: 'destructive', }); } }, [state, toast]); return ( Create a new prompt Craft your next masterpiece. Add notes and tags to keep it organized.
{state.errors?.title &&

{state.errors.title[0]}

}