import { DndContext, DragEndEvent, PointerSensor, closestCenter, useSensor, useSensors } from '@dnd-kit/core' import { SortableContext, arrayMove, horizontalListSortingStrategy } from '@dnd-kit/sortable' import { Button } from '@heroui/button' import { useEffect, useState } from 'react' import toast from 'react-hot-toast' import { IoAdd, IoClose } from 'react-icons/io5' import { TabList, TabPanel, Tabs } from '@/components/tabs' import { SortableTab } from '@/components/tabs/sortable_tab.tsx' import { TerminalInstance } from '@/components/terminal/terminal-instance' import terminalManager from '@/controllers/terminal_manager' interface TerminalTab { id: string title: string } export default function TerminalPage() { const [tabs, setTabs] = useState([]) const [selectedTab, setSelectedTab] = useState('') useEffect(() => { // 获取已存在的终端列表 terminalManager.getTerminalList().then((terminals) => { if (terminals.length === 0) return const newTabs = terminals.map((terminal) => ({ id: terminal.id, title: terminal.id })) setTabs(newTabs) setSelectedTab(newTabs[0].id) }) }, []) const createNewTerminal = async () => { try { const { id } = await terminalManager.createTerminal(80, 24) const newTab = { id, title: id } setTabs((prev) => [...prev, newTab]) setSelectedTab(id) } catch (error) { console.error('Failed to create terminal:', error) toast.error('创建终端失败') } } const closeTerminal = async (id: string) => { try { await terminalManager.closeTerminal(id) terminalManager.removeTerminal(id) if (selectedTab === id) { const previousIndex = tabs.findIndex((tab) => tab.id === id) - 1 if (previousIndex >= 0) { setSelectedTab(tabs[previousIndex].id) } else { setSelectedTab(tabs[0]?.id || '') } } setTabs((prev) => prev.filter((tab) => tab.id !== id)) } catch (error) { toast.error('关闭终端失败') } } const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event if (active.id !== over?.id) { setTabs((items) => { const oldIndex = items.findIndex((item) => item.id === active.id) const newIndex = items.findIndex((item) => item.id === over?.id) return arrayMove(items, oldIndex, newIndex) }) } } const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8 } }) ) return (
{tabs.map((tab) => ( {tab.title} ))}
{tabs.length === 0 && (
点击右上角按钮创建终端
)} {tabs.map((tab) => ( ))}
) }