import { useEffect, useState } from 'react' import api from '@/services/api' import type { Milestone, Project } from '@/types' type Props = { isOpen: boolean onClose: () => void onSaved?: (milestone: Milestone) => void | Promise milestone?: Milestone | null initialProjectId?: number lockProject?: boolean } type FormState = { title: string description: string project_id: number status: string due_date: string planned_release_date: string } const emptyForm: FormState = { title: '', description: '', project_id: 0, status: 'open', due_date: '', planned_release_date: '', } const toDateInput = (value?: string | null) => (value ? String(value).slice(0, 10) : '') export default function MilestoneFormModal({ isOpen, onClose, onSaved, milestone, initialProjectId, lockProject = false }: Props) { const [projects, setProjects] = useState([]) const [saving, setSaving] = useState(false) const [form, setForm] = useState(emptyForm) useEffect(() => { if (!isOpen) return const init = async () => { const { data } = await api.get('/projects') setProjects(data) const defaultProjectId = milestone?.project_id || initialProjectId || data[0]?.id || 0 setForm({ title: milestone?.title || '', description: milestone?.description || '', project_id: defaultProjectId, status: milestone?.status || 'open', due_date: toDateInput(milestone?.due_date), planned_release_date: toDateInput(milestone?.planned_release_date), }) } init().catch(console.error) }, [isOpen, milestone, initialProjectId]) const submit = async (e: React.FormEvent) => { e.preventDefault() setSaving(true) try { const payload = { title: form.title, description: form.description || null, project_id: form.project_id, status: form.status, due_date: form.due_date || null, planned_release_date: form.planned_release_date || null, } if (milestone) { const { data } = await api.patch(`/milestones/${milestone.id}`, payload) await onSaved?.(data) } else { const { data } = await api.post('/milestones', payload) await onSaved?.(data) } onClose() } finally { setSaving(false) } } if (!isOpen) return null return (
e.stopPropagation()}>

{milestone ? 'Edit Milestone' : 'Create Milestone'}