import { useState, useEffect } from "react"; import { useParams, useNavigate } from "react-router"; import { Masthead } from "../components/Masthead"; import { OrderList } from "../components/orders/OrderList"; import { OrderDetail } from "../components/orders/OrderDetail"; import { useOrders, useOrder } from "../hooks/useOrders"; import { useDirectives } from "../hooks/useDirectives"; import { useDogs } from "../hooks/useDogs"; import { useAuth } from "../contexts/AuthContext"; import type { OrderStatus, OrderType, OrderPriority } from "../lib/api"; export default function OrdersPage() { const { isAuthenticated, isAuthConfigured, isLoading: authLoading } = useAuth(); const navigate = useNavigate(); const { id: selectedId } = useParams<{ id: string }>(); const [statusFilter, setStatusFilter] = useState(undefined); const [typeFilter, setTypeFilter] = useState(undefined); const { orders, loading: listLoading, create, refresh: refreshList } = useOrders(statusFilter, typeFilter); const { order, refresh: refreshDetail, update, remove: removeOrder, linkDirective, convertToStep } = useOrder(selectedId); const { directives } = useDirectives(); const { dogs } = useDogs(order?.directiveId ?? undefined); const [showCreate, setShowCreate] = useState(false); const [newTitle, setNewTitle] = useState(""); const [newDesc, setNewDesc] = useState(""); const [newPriority, setNewPriority] = useState("medium"); const [newType, setNewType] = useState("feature"); const [newDirectiveId, setNewDirectiveId] = useState(""); useEffect(() => { if (!authLoading && isAuthConfigured && !isAuthenticated) { navigate("/login"); } }, [authLoading, isAuthConfigured, isAuthenticated, navigate]); if (authLoading) { return (

Loading...

); } const handleCreate = async () => { if (!newTitle.trim() || !newDirectiveId) return; try { const o = await create({ title: newTitle.trim(), description: newDesc.trim() || undefined, priority: newPriority, orderType: newType, directiveId: newDirectiveId, }); setShowCreate(false); setNewTitle(""); setNewDesc(""); setNewPriority("medium"); setNewType("feature"); setNewDirectiveId(""); navigate(`/orders/${o.id}`); } catch (e) { console.error("Failed to create order:", e); } }; const handleDelete = async () => { if (!selectedId) return; if (!window.confirm("Delete this order?")) return; try { await removeOrder(); await refreshList(); navigate("/orders"); } catch (e) { console.error("Failed to delete:", e); } }; const handleUpdate = async (req: Parameters[0]) => { await update(req); await refreshList(); }; const handleLinkDirective = async (directiveId: string) => { await linkDirective(directiveId); await refreshList(); }; const handleConvertToStep = async () => { await convertToStep(); await refreshList(); }; const priorityOptions: { value: OrderPriority; label: string }[] = [ { value: "critical", label: "Critical" }, { value: "high", label: "High" }, { value: "medium", label: "Medium" }, { value: "low", label: "Low" }, { value: "none", label: "None" }, ]; const typeOptions: { value: OrderType; label: string }[] = [ { value: "feature", label: "Feature" }, { value: "bug", label: "Bug" }, { value: "spike", label: "Spike" }, { value: "chore", label: "Chore" }, { value: "improvement", label: "Improvement" }, ]; return (
{/* Left: List */}
navigate(`/orders/${id}`)} onCreate={() => setShowCreate(true)} statusFilter={statusFilter} onStatusFilter={setStatusFilter} typeFilter={typeFilter} onTypeFilter={setTypeFilter} />
{/* Right: Detail or Create */}
{showCreate ? (

New Order

setNewTitle(e.target.value)} placeholder="Order title..." className="w-full bg-[#0a1628] border border-[rgba(117,170,252,0.2)] rounded px-2 py-1.5 text-[12px] font-mono text-white" onKeyDown={(e) => { if (e.key === "Enter" && newTitle.trim()) handleCreate(); }} />