import { useState, useId } from 'react' import { X, Save, Plus, Trash2, Loader2, AlertCircle } from 'lucide-react' import { useUpdateFeature } from '../hooks/useProjects' import type { Feature } from '../lib/types' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Label } from '@/components/ui/label' import { Alert, AlertDescription } from '@/components/ui/alert' interface Step { id: string value: string } interface EditFeatureFormProps { feature: Feature projectName: string onClose: () => void onSaved: () => void } export function EditFeatureForm({ feature, projectName, onClose, onSaved }: EditFeatureFormProps) { const formId = useId() const [category, setCategory] = useState(feature.category) const [name, setName] = useState(feature.name) const [description, setDescription] = useState(feature.description) const [priority, setPriority] = useState(String(feature.priority)) const [steps, setSteps] = useState(() => feature.steps.length > 0 ? feature.steps.map((step, i) => ({ id: `${formId}-step-${i}`, value: step })) : [{ id: `${formId}-step-0`, value: '' }] ) const [error, setError] = useState(null) const [stepCounter, setStepCounter] = useState(feature.steps.length || 1) const updateFeature = useUpdateFeature(projectName) const handleAddStep = () => { setSteps([...steps, { id: `${formId}-step-${stepCounter}`, value: '' }]) setStepCounter(stepCounter + 1) } const handleRemoveStep = (id: string) => { setSteps(steps.filter(step => step.id !== id)) } const handleStepChange = (id: string, value: string) => { setSteps(steps.map(step => step.id === id ? { ...step, value } : step )) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError(null) const filteredSteps = steps .map(s => s.value.trim()) .filter(s => s.length > 0) try { await updateFeature.mutateAsync({ featureId: feature.id, update: { category: category.trim(), name: name.trim(), description: description.trim(), steps: filteredSteps, priority: parseInt(priority, 10), }, }) onSaved() } catch (err) { setError(err instanceof Error ? err.message : 'Failed to update feature') } } const isValid = category.trim() && name.trim() && description.trim() // Check if any changes were made const currentSteps = steps.map(s => s.value.trim()).filter(s => s) const hasChanges = category.trim() !== feature.category || name.trim() !== feature.name || description.trim() !== feature.description || parseInt(priority, 10) !== feature.priority || JSON.stringify(currentSteps) !== JSON.stringify(feature.steps) return ( !open && onClose()}> Edit Feature
{/* Error Message */} {error && ( {error} )} {/* Category & Priority Row */}
setCategory(e.target.value)} placeholder="e.g., Authentication, UI, API" required />
setPriority(e.target.value)} min="1" required />
{/* Name */}
setName(e.target.value)} placeholder="e.g., User login form" required />
{/* Description */}