import { Fragment, useState } from 'react'; import { ChevronRight, ChevronDown } from 'lucide-react'; import { useC2Tasks } from '@/hooks/useC2'; import { C2TaskStatusBadge } from './C2TaskStatusBadge'; interface C2TasksPanelProps { simulationId: number; } export function C2TasksPanel({ simulationId }: C2TasksPanelProps): JSX.Element { const query = useC2Tasks(simulationId, { enabled: true }); const [expandedIds, setExpandedIds] = useState>(new Set()); const tasks = query.data?.tasks ?? []; const isRefreshing = query.isFetching && !query.isLoading; function toggleExpand(id: number, completed: boolean) { if (!completed) return; setExpandedIds((prev) => { const next = new Set(prev); if (next.has(id)) { next.delete(id); } else { next.add(id); } return next; }); } return (

C2 Tasks

{isRefreshing && ( Refreshing… )}
{tasks.length === 0 ? (

No C2 tasks yet. Use Execute via C2 to launch commands.

) : (
{tasks.map((task) => { const isExpanded = expandedIds.has(task.id); const canExpand = task.completed && Boolean(task.output); return ( toggleExpand(task.id, task.completed)} className={`border-b border-hairline ${canExpand ? 'cursor-pointer hover:bg-cloud' : ''}`} > {isExpanded && task.output && ( )} ); })}
Task Command Source Status Completed at
{canExpand ? ( isExpanded ? ( ) : ( ) ) : null} #{task.mythic_task_display_id} {task.command} {task.mapping_applied ? 'MIMIC' : 'IMPORT'} {task.completed_at ?? '—'}
                            {task.output}
                          
)}
); }