import { useState, useCallback } from "react"; import { useDialog } from "../context/DialogContext"; import { useCompany } from "../context/CompanyContext"; import { projectsApi } from "../api/projects"; import { goalsApi } from "../api/goals"; import { useApi } from "../hooks/useApi"; import { Dialog, DialogContent, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Maximize2, Minimize2, Target, Calendar, } from "lucide-react"; import { cn } from "../lib/utils"; import { StatusBadge } from "./StatusBadge"; import type { Goal } from "@paperclip/shared"; const projectStatuses = [ { value: "backlog", label: "Backlog" }, { value: "planned", label: "Planned" }, { value: "in_progress", label: "In Progress" }, { value: "completed", label: "Completed" }, { value: "cancelled", label: "Cancelled" }, ]; interface NewProjectDialogProps { onCreated?: () => void; } export function NewProjectDialog({ onCreated }: NewProjectDialogProps) { const { newProjectOpen, closeNewProject } = useDialog(); const { selectedCompanyId, selectedCompany } = useCompany(); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [status, setStatus] = useState("planned"); const [goalId, setGoalId] = useState(""); const [targetDate, setTargetDate] = useState(""); const [expanded, setExpanded] = useState(false); const [submitting, setSubmitting] = useState(false); const [statusOpen, setStatusOpen] = useState(false); const [goalOpen, setGoalOpen] = useState(false); const goalsFetcher = useCallback(() => { if (!selectedCompanyId) return Promise.resolve([] as Goal[]); return goalsApi.list(selectedCompanyId); }, [selectedCompanyId]); const { data: goals } = useApi(goalsFetcher); function reset() { setName(""); setDescription(""); setStatus("planned"); setGoalId(""); setTargetDate(""); setExpanded(false); } async function handleSubmit() { if (!selectedCompanyId || !name.trim()) return; setSubmitting(true); try { await projectsApi.create(selectedCompanyId, { name: name.trim(), description: description.trim() || undefined, status, ...(goalId ? { goalId } : {}), ...(targetDate ? { targetDate } : {}), }); reset(); closeNewProject(); onCreated?.(); } finally { setSubmitting(false); } } function handleKeyDown(e: React.KeyboardEvent) { if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); handleSubmit(); } } const currentGoal = (goals ?? []).find((g) => g.id === goalId); return ( { if (!open) { reset(); closeNewProject(); } }} > {/* Header */}
{selectedCompany && ( {selectedCompany.name.slice(0, 3).toUpperCase()} )} New project
{/* Name */}
setName(e.target.value)} autoFocus />
{/* Description */}