'use client'; import type { ReactNode } from 'react'; import { memo, useState } from 'react'; import { IconChevronDown, IconChevronUp, IconX } from '@tabler/icons-react'; import { Badge } from '@kandev/ui/badge'; import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@kandev/ui/resizable'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@kandev/ui/tabs'; import { getLocalStorage, setLocalStorage } from '@/lib/local-storage'; import { COMMANDS } from '@/components/task/task-data'; import { ShellTerminal } from '@/components/task/shell-terminal'; type TaskRightPanelProps = { topPanel: ReactNode; }; const DEFAULT_RIGHT_LAYOUT: [number, number] = [55, 45]; const TaskRightPanel = memo(function TaskRightPanel({ topPanel }: TaskRightPanelProps) { const [rightLayout, setRightLayout] = useState<[number, number]>(() => getLocalStorage('task-layout-right', DEFAULT_RIGHT_LAYOUT) ); const [activeTerminalId, setActiveTerminalId] = useState(1); const [terminalIds, setTerminalIds] = useState([1]); const [isBottomCollapsed, setIsBottomCollapsed] = useState(false); const addTerminal = () => { setTerminalIds((ids) => { const nextId = Math.max(0, ...ids) + 1; setActiveTerminalId(nextId); return [...ids, nextId]; }); }; const removeTerminal = (id: number) => { setTerminalIds((ids) => { const nextIds = ids.filter((terminalId) => terminalId !== id); if (activeTerminalId === id) { const fallback = nextIds[0] ?? 1; setActiveTerminalId(fallback); } return nextIds.length ? nextIds : [1]; }); }; const terminalTabValue = activeTerminalId === 0 ? 'commands' : `terminal-${activeTerminalId}`; if (isBottomCollapsed) { return (
{topPanel}
{ if (value === 'commands') { setActiveTerminalId(0); return; } const parsed = Number(value.replace('terminal-', '')); if (!Number.isNaN(parsed)) { setActiveTerminalId(parsed); } }} className="flex-1 min-h-0" > Commands {terminalIds.map((id) => ( {id === 1 ? 'Terminal' : `Terminal ${id}`} ))} +
); } return ( { setRightLayout(sizes as [number, number]); setLocalStorage('task-layout-right', sizes); }} > {topPanel}
{ if (value === 'commands') { setActiveTerminalId(0); return; } const parsed = Number(value.replace('terminal-', '')); if (!Number.isNaN(parsed)) { setActiveTerminalId(parsed); } }} className="flex-1 min-h-0" >
Commands {terminalIds.map((id) => ( {id === 1 ? 'Terminal' : `Terminal ${id}`} {terminalIds.length > 1 && ( { event.preventDefault(); event.stopPropagation(); removeTerminal(id); }} > )} ))} +
{COMMANDS.map((command) => ( ))}
{terminalIds.map((id) => (
))}
); }); export { TaskRightPanel };