import { useEffect, useState } from "react"; import { useCategories } from "../hooks/useCategories"; import { useCreateThread } from "../hooks/useThreads"; import { useUIStore } from "../stores/uiStore"; export function CreateThreadModal() { const isOpen = useUIStore((s) => s.createThreadModalOpen); const closeModal = useUIStore((s) => s.closeCreateThreadModal); const { data: categories } = useCategories(); const createThread = useCreateThread(); const [name, setName] = useState(""); const [categoryId, setCategoryId] = useState(null); const [error, setError] = useState(null); // Pre-select first category when categories load useEffect(() => { if (categories && categories.length > 0 && categoryId === null) { setCategoryId(categories[0].id); } }, [categories, categoryId]); if (!isOpen) return null; function resetForm() { setName(""); setCategoryId(categories?.[0]?.id ?? null); setError(null); } function handleClose() { resetForm(); closeModal(); } function handleSubmit(e: React.FormEvent) { e.preventDefault(); const trimmed = name.trim(); if (!trimmed) { setError("Thread name is required"); return; } if (categoryId === null) { setError("Please select a category"); return; } setError(null); createThread.mutate( { name: trimmed, categoryId }, { onSuccess: () => { resetForm(); closeModal(); }, onError: (err) => { setError( err instanceof Error ? err.message : "Failed to create thread", ); }, }, ); } return (
{ if (e.key === "Escape") handleClose(); }} >
e.stopPropagation()} onKeyDown={() => {}} >

New Thread

setName(e.target.value)} placeholder="e.g. Lightweight sleeping bag" className="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-gray-400 focus:border-transparent" />
{error &&

{error}

}
); }