import type React from 'react'; import { useContext, useState, useCallback } from 'react'; import { Button } from '@/components/ui/button'; import { useQueryClient } from '@tanstack/react-query'; import { RefreshCw } from 'lucide-react'; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbSeparator } from '@/components/ui/breadcrumb'; import { VSCodeContext } from '../webview/contexts/VSCodeContext'; import { AIActionsSection } from './TaskDetails/AIActionsSection'; import { SubtasksSection } from './TaskDetails/SubtasksSection'; import { TaskMetadataSidebar } from './TaskDetails/TaskMetadataSidebar'; import { DetailsSection } from './TaskDetails/DetailsSection'; import { useTaskDetails } from './TaskDetails/useTaskDetails'; import { useTasks, taskKeys } from '../webview/hooks/useTaskQueries'; import type { TaskMasterTask } from '../webview/types'; interface TaskDetailsViewProps { taskId: string; onNavigateBack: () => void; onNavigateToTask: (taskId: string) => void; } export const TaskDetailsView: React.FC = ({ taskId, onNavigateBack, onNavigateToTask }) => { const context = useContext(VSCodeContext); if (!context) { throw new Error('TaskDetailsView must be used within VSCodeProvider'); } const { state, sendMessage } = context; const { currentTag } = state; const queryClient = useQueryClient(); const [isRefreshing, setIsRefreshing] = useState(false); // Use React Query to fetch all tasks const { data: allTasks = [] } = useTasks({ tag: currentTag }); const { currentTask, parentTask, isSubtask, taskFileData, taskFileDataError, complexity, refreshComplexityAfterAI } = useTaskDetails({ taskId, sendMessage, tasks: allTasks }); const displayId = isSubtask && parentTask ? `${parentTask.id}.${currentTask?.id}` : currentTask?.id; const handleStatusChange = async (newStatus: TaskMasterTask['status']) => { if (!currentTask) return; try { await sendMessage({ type: 'updateTaskStatus', data: { taskId: displayId, newStatus: newStatus } }); } catch (error) { console.error('❌ TaskDetailsView: Failed to update task status:', error); } }; const handleDependencyClick = (depId: string) => { onNavigateToTask(depId); }; const handleRefresh = useCallback(async () => { setIsRefreshing(true); try { // Invalidate all task queries await queryClient.invalidateQueries({ queryKey: taskKeys.all }); } finally { // Reset after a short delay to show the animation setTimeout(() => setIsRefreshing(false), 500); } }, [queryClient]); if (!currentTask) { return (

Task not found

); } return (
{/* Left column - Main content (2/3 width) */}
{/* Breadcrumb navigation */}
Kanban Board {isSubtask && parentTask && ( <> onNavigateToTask(parentTask.id)} className="cursor-pointer hover:text-vscode-foreground" > {parentTask.title} )} #{displayId} {currentTask.title}
{/* Task ID and title */}

#{displayId} {currentTask.title}

{/* Description */}

{currentTask.description || 'No description available.'}

{/* AI Actions */} {/* Implementation Details */} {/* Test Strategy */} {/* Subtasks */}
{/* Right column - Metadata (1/3 width) */}
); }; export default TaskDetailsView;