import React, { useState } from 'react'; import { ArrowRight, List, Clock, Flag, CheckCircle, Circle, AlertCircle, Pause, ChevronDown, ChevronUp, Plus, FileText, Settings, X, Terminal, Eye, Play, Zap, Target } from 'lucide-react'; import { cn } from '../lib/utils'; import { useTaskMaster } from '../contexts/TaskMasterContext'; import { api } from '../utils/api'; import Shell from './Shell'; import TaskDetail from './TaskDetail'; const NextTaskBanner = ({ onShowAllTasks, onStartTask, className = '' }) => { const { nextTask, tasks, currentProject, isLoadingTasks, projectTaskMaster, refreshTasks, refreshProjects } = useTaskMaster(); const [showDetails, setShowDetails] = useState(false); const [showTaskOptions, setShowTaskOptions] = useState(false); const [showCreateTaskModal, setShowCreateTaskModal] = useState(false); const [showTemplateSelector, setShowTemplateSelector] = useState(false); const [showCLI, setShowCLI] = useState(false); const [showTaskDetail, setShowTaskDetail] = useState(false); const [isLoading, setIsLoading] = useState(false); // Handler functions const handleInitializeTaskMaster = async () => { if (!currentProject) return; setIsLoading(true); try { const response = await api.taskmaster.init(currentProject.name); if (response.ok) { await refreshProjects(); setShowTaskOptions(false); } else { const error = await response.json(); console.error('Failed to initialize TaskMaster:', error); alert(`Failed to initialize TaskMaster: ${error.message}`); } } catch (error) { console.error('Error initializing TaskMaster:', error); alert('Error initializing TaskMaster. Please try again.'); } finally { setIsLoading(false); } }; const handleCreateManualTask = () => { setShowCreateTaskModal(true); setShowTaskOptions(false); }; const handleParsePRD = () => { setShowTemplateSelector(true); setShowTaskOptions(false); }; // Don't show if no project or still loading if (!currentProject || isLoadingTasks) { return null; } let bannerContent; // Show setup message only if no tasks exist AND TaskMaster is not configured if ((!tasks || tasks.length === 0) && !projectTaskMaster?.hasTaskmaster) { bannerContent = (
TaskMaster AI is not configured
{showTaskOptions && (
{!projectTaskMaster?.hasTaskmaster && (

🎯 What is TaskMaster?

• AI-Powered Task Management: Break complex projects into manageable subtasks

• PRD Templates: Generate tasks from Product Requirements Documents

• Dependency Tracking: Understand task relationships and execution order

• Progress Visualization: Kanban boards and detailed task analytics

• CLI Integration: Use taskmaster commands for advanced workflows

)}
{!projectTaskMaster?.hasTaskmaster ? ( ) : ( <>
Add more tasks: Create additional tasks manually or generate them from a PRD template
)}
)}
); } else if (nextTask) { // Show next task if available bannerContent = (
Task {nextTask.id} {nextTask.priority === 'high' && (
)} {nextTask.priority === 'medium' && (
)} {nextTask.priority === 'low' && (
)}

{nextTask.title}

{onShowAllTasks && ( )}
); } else if (tasks && tasks.length > 0) { // Show completion message only if there are tasks and all are done const completedTasks = tasks.filter(task => task.status === 'done').length; const totalTasks = tasks.length; bannerContent = (
{completedTasks === totalTasks ? "All done! 🎉" : "No pending tasks"}
{completedTasks}/{totalTasks}
); } else { // TaskMaster is configured but no tasks exist - don't show anything in chat bannerContent = null; } return ( <> {bannerContent} {/* Create Task Modal */} {showCreateTaskModal && ( setShowCreateTaskModal(false)} onTaskCreated={() => { refreshTasks(); setShowCreateTaskModal(false); }} /> )} {/* Template Selector Modal */} {showTemplateSelector && ( setShowTemplateSelector(false)} onTemplateApplied={() => { refreshTasks(); setShowTemplateSelector(false); }} /> )} {/* TaskMaster CLI Setup Modal */} {showCLI && (
{/* Modal Header */}

TaskMaster Setup

Interactive CLI for {currentProject?.displayName}

{/* Terminal Container */}
{/* Modal Footer */}
TaskMaster initialization will start automatically
)} {/* Task Detail Modal */} {showTaskDetail && nextTask && ( setShowTaskDetail(false)} onStatusChange={() => refreshTasks?.()} onTaskClick={null} // Disable dependency navigation in NextTaskBanner for now /> )} ); }; // Simple Create Task Modal Component const CreateTaskModal = ({ currentProject, onClose, onTaskCreated }) => { const [formData, setFormData] = useState({ title: '', description: '', priority: 'medium', useAI: false, prompt: '' }); const [isSubmitting, setIsSubmitting] = useState(false); const handleSubmit = async (e) => { e.preventDefault(); if (!currentProject) return; setIsSubmitting(true); try { const taskData = formData.useAI ? { prompt: formData.prompt, priority: formData.priority } : { title: formData.title, description: formData.description, priority: formData.priority }; const response = await api.taskmaster.addTask(currentProject.name, taskData); if (response.ok) { onTaskCreated(); } else { const error = await response.json(); console.error('Failed to create task:', error); alert(`Failed to create task: ${error.message}`); } } catch (error) { console.error('Error creating task:', error); alert('Error creating task. Please try again.'); } finally { setIsSubmitting(false); } }; return (

Create New Task

{formData.useAI ? (