import { useState, useCallback, useEffect, useRef } from "react"; import type { Task, TaskCreateInput } from "@hai/core"; import type { ToastType } from "../hooks/useToast"; interface CreateTaskModalProps { onClose: () => void; onCreateTask: (input: TaskCreateInput) => Promise; addToast: (message: string, type?: ToastType) => void; } export function CreateTaskModal({ onClose, onCreateTask, addToast }: CreateTaskModalProps) { const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [deps, setDeps] = useState(""); const titleRef = useRef(null); useEffect(() => { setTimeout(() => titleRef.current?.focus(), 100); }, []); useEffect(() => { const handleKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", handleKey); return () => document.removeEventListener("keydown", handleKey); }, [onClose]); const handleOverlayClick = useCallback( (e: React.MouseEvent) => { if (e.target === e.currentTarget) onClose(); }, [onClose], ); const handleSubmit = useCallback( async (e: React.FormEvent) => { e.preventDefault(); const trimmedTitle = title.trim(); if (!trimmedTitle) return; const dependencies = deps .split(",") .map((s) => s.trim()) .filter(Boolean); try { const task = await onCreateTask({ title: trimmedTitle, description: description.trim() || undefined, dependencies: dependencies.length ? dependencies : undefined, }); addToast(`Created ${task.id}`, "success"); onClose(); } catch (err: any) { addToast(err.message, "error"); } }, [title, description, deps, onCreateTask, addToast, onClose], ); return (

New Task

setTitle(e.target.value)} />