'use client'; import { memo, useEffect, useMemo, useState, useCallback } from 'react'; import { IconX, IconChevronDown, IconPlayerPlay, IconPlus } from '@tabler/icons-react'; import { TabsContent } from '@kandev/ui/tabs'; import { Button } from '@kandev/ui/button'; import { SessionPanel, SessionPanelContent } from '@kandev/ui/pannel-session'; import { Tooltip, TooltipContent, TooltipTrigger } from '@kandev/ui/tooltip'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@kandev/ui/dropdown-menu'; import { useAppStore } from '@/components/state-provider'; import { useLayoutStore } from '@/lib/state/layout-store'; // closeDocument kept for mobile/tablet backward compat import { getWebSocketClient } from '@/lib/ws/connection'; import { useTask } from '@/hooks/use-task'; import { SessionTabs, type SessionTab } from '@/components/session-tabs'; import { TaskPlanPanel } from '../task-plan-panel'; import { TaskCreateDialog } from '@/components/task-create-dialog'; import type { ActiveDocument } from '@/lib/state/slices/ui/types'; type DocumentPanelProps = { sessionId: string | null; }; export const DocumentPanel = memo(function DocumentPanel({ sessionId }: DocumentPanelProps) { const activeDocument = useAppStore((state) => sessionId ? state.documentPanel.activeDocumentBySessionId[sessionId] ?? null : null ); const setActiveDocument = useAppStore((state) => state.setActiveDocument); const closeDocument = useLayoutStore((state) => state.closeDocument); const handleClose = () => { if (!sessionId) return; closeDocument(sessionId); setActiveDocument(sessionId, null); }; // Auto-close document layout when no document is active (e.g. stale localStorage) useEffect(() => { if (!activeDocument && sessionId) { closeDocument(sessionId); } }, [activeDocument, sessionId, closeDocument]); const tabs: SessionTab[] = useMemo(() => { if (!activeDocument) return []; if (activeDocument.type === 'plan') { return [{ id: 'plan', label: 'Plan' }]; } return [{ id: 'file', label: activeDocument.name }]; }, [activeDocument]); const activeTab = activeDocument?.type === 'plan' ? 'plan' : 'file'; if (!activeDocument) { return null; } const isPlan = activeDocument.type === 'plan'; const headerActions = (