import { useState, useCallback, useEffect } from "react"; import type { TaskWithSubtasks, TaskStatus } from "../../lib/api"; import { getTask, updateTask } from "../../lib/api"; interface InlineSubtaskEditorProps { subtaskId: string; onClose: () => void; onUpdated: () => void; onNavigate?: (taskId: string) => void; } function getStatusColor(status: TaskStatus): string { switch (status) { case "pending": return "text-[#9bc3ff]"; case "running": return "text-green-400"; case "paused": return "text-yellow-400"; case "blocked": return "text-orange-400"; case "done": return "text-emerald-400"; case "failed": return "text-red-400"; case "merged": return "text-purple-400"; default: return "text-[#9bc3ff]"; } } function getStatusBgColor(status: TaskStatus): string { switch (status) { case "pending": return "bg-[rgba(117,170,252,0.1)]"; case "running": return "bg-green-400/10"; case "paused": return "bg-yellow-400/10"; case "blocked": return "bg-orange-400/10"; case "done": return "bg-emerald-400/10"; case "failed": return "bg-red-400/10"; case "merged": return "bg-purple-400/10"; default: return "bg-[rgba(117,170,252,0.1)]"; } } export function InlineSubtaskEditor({ subtaskId, onClose, onUpdated, onNavigate, }: InlineSubtaskEditorProps) { const [subtask, setSubtask] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [isEditing, setIsEditing] = useState(false); const [editName, setEditName] = useState(""); const [editDescription, setEditDescription] = useState(""); const [editPlan, setEditPlan] = useState(""); // Load subtask details useEffect(() => { setLoading(true); getTask(subtaskId) .then((task) => { setSubtask(task); setEditName(task.name); setEditDescription(task.description || ""); setEditPlan(task.plan); }) .catch((err) => { console.error("Failed to load subtask:", err); }) .finally(() => { setLoading(false); }); }, [subtaskId]); const handleSave = useCallback(async () => { if (!subtask || saving) return; setSaving(true); try { await updateTask(subtaskId, { name: editName, description: editDescription || undefined, plan: editPlan, version: subtask.version, }); // Refresh subtask const updated = await getTask(subtaskId); setSubtask(updated); setIsEditing(false); onUpdated(); } catch (err) { console.error("Failed to save subtask:", err); } finally { setSaving(false); } }, [subtask, subtaskId, editName, editDescription, editPlan, saving, onUpdated]); const handleCancel = useCallback(() => { if (subtask) { setEditName(subtask.name); setEditDescription(subtask.description || ""); setEditPlan(subtask.plan); } setIsEditing(false); }, [subtask]); if (loading) { return (
Loading subtask...
); } if (!subtask) { return (
Failed to load subtask
); } return (
{/* Header */}
{subtask.status} {onNavigate && ( )}
{isEditing ? ( <> ) : ( )}
{/* Content */}
{/* Name */} {isEditing ? ( setEditName(e.target.value)} className="w-full bg-transparent border border-[rgba(117,170,252,0.25)] text-[#dbe7ff] font-mono text-sm px-2 py-1 outline-none focus:border-[#3f6fb3]" placeholder="Subtask name" /> ) : (
{subtask.name}
)} {/* Description */} {isEditing ? (