import React, { useState, useEffect } from 'react'; import { useCreatePrompt } from './hooks/usePrompts'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from './ui/dialog'; import { Label } from './ui/label'; import { Input } from './ui/input'; import { Textarea } from './ui/textarea'; import { Button } from './ui/button'; import { Badge } from './ui/badge'; import { Alert, AlertDescription } from './ui/alert'; import { Loader2, Trash2, Upload, FileText } from 'lucide-react'; interface CreatePromptModalProps { open: boolean; onClose: () => void; onCreated: (prompt: { name: string }) => void; } interface ResourcePayload { data: string; mimeType: string; filename?: string; } export default function CreatePromptModal({ open, onClose, onCreated }: CreatePromptModalProps) { const [name, setName] = useState(''); const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [content, setContent] = useState(''); const [resource, setResource] = useState(null); const [resourcePreview, setResourcePreview] = useState(null); const [resourceName, setResourceName] = useState(null); const [isDragOver, setIsDragOver] = useState(false); const createPromptMutation = useCreatePrompt(); useEffect(() => { if (open) { setName(''); setTitle(''); setDescription(''); setContent(''); setResource(null); setResourcePreview(null); setResourceName(null); setIsDragOver(false); createPromptMutation.reset(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [open]); const handleFile = async (file: File) => { try { const data = await readFileAsDataUrl(file); setResource({ data, mimeType: file.type || 'application/octet-stream', filename: file.name, }); setResourcePreview(data); setResourceName(file.name); } catch (error) { console.error('Failed to read file:', error); } }; const handleResourceChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) { setResource(null); setResourcePreview(null); setResourceName(null); return; } await handleFile(file); }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setIsDragOver(true); }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); setIsDragOver(false); }; const handleDrop = async (e: React.DragEvent) => { e.preventDefault(); setIsDragOver(false); const files = Array.from(e.dataTransfer.files); if (files.length > 0) { await handleFile(files[0]); } }; const removeResource = () => { setResource(null); setResourcePreview(null); setResourceName(null); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!name.trim() || !content.trim()) { return; } const payload = { name: name.trim(), title: title.trim() || undefined, description: description.trim() || undefined, content, resource: resource || undefined, }; createPromptMutation.mutate(payload, { onSuccess: (data) => { if (data?.prompt) { onCreated({ name: data.prompt.name }); } onClose(); }, }); }; return ( !isOpen && onClose()}> Create Custom Prompt Define reusable prompt text and optionally attach a supporting resource file.
{createPromptMutation.error && ( {createPromptMutation.error instanceof Error ? createPromptMutation.error.message : 'Failed to create prompt'} )}
setName(e.target.value)} placeholder="research-summary" required />

Use lowercase letters, numbers, or hyphens. This becomes your /prompt command.

setTitle(e.target.value)} placeholder="Research Summary" />
setDescription(e.target.value)} placeholder="Summarize research papers with key findings" />