import { useEffect, useMemo, useState } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@renderer/components/ui/tabs'; import { ExecutionSessionsSection } from './ExecutionSessionsSection'; import { isBoardTaskActivityUiEnabled, isBoardTaskExactLogsUiEnabled } from './featureGates'; import { TaskActivitySection } from './TaskActivitySection'; import { TaskLogStreamSection } from './TaskLogStreamSection'; import type { TeamTaskWithKanban } from '@shared/types'; type TaskLogsTab = 'activity' | 'stream' | 'sessions'; interface TaskLogsPanelProps { teamName: string; task: TeamTaskWithKanban; taskSince?: string; isExecutionRefreshing?: boolean; isExecutionPreviewOnline?: boolean; onRefreshingChange?: (isRefreshing: boolean) => void; showSubagentPreview?: boolean; showLeadPreview?: boolean; onPreviewOnlineChange?: (isOnline: boolean) => void; } export const TaskLogsPanel = ({ teamName, task, taskSince, isExecutionRefreshing = false, isExecutionPreviewOnline = false, onRefreshingChange, showSubagentPreview = false, showLeadPreview = false, onPreviewOnlineChange, }: TaskLogsPanelProps): React.JSX.Element => { const availableTabs = useMemo(() => { const tabs: TaskLogsTab[] = []; if (isBoardTaskExactLogsUiEnabled()) { tabs.push('stream'); } if (isBoardTaskActivityUiEnabled()) { tabs.push('activity'); } tabs.push('sessions'); return tabs; }, []); const defaultTab = availableTabs[0] ?? 'sessions'; const [activeTab, setActiveTab] = useState(defaultTab); useEffect(() => { setActiveTab(defaultTab); }, [defaultTab, task.id]); useEffect(() => { if (!availableTabs.includes(activeTab)) { setActiveTab(defaultTab); } }, [activeTab, availableTabs, defaultTab]); return ( setActiveTab(value as TaskLogsTab)} className="space-y-3" > {availableTabs.includes('stream') ? ( Task Log Stream ) : null} {availableTabs.includes('activity') ? ( Task Activity ) : null} Execution Sessions {availableTabs.includes('stream') ? ( ) : null} {availableTabs.includes('activity') ? ( ) : null} ); };