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 { useLocalStorage } from '@uidotdev/usehooks'; import clsx from 'clsx'; import { useEffect, useState } from 'react'; import toast from 'react-hot-toast'; import { IoAdd, IoClose } from 'react-icons/io5'; import key from '@/const/key'; 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(''); const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); const hasBackground = !!backgroundImage; 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: unknown) { console.error('Failed to create terminal:', error); toast.error((error as Error).message); } }; 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.length > 0 && ( {tabs.map((tab) => ( {tab.title} ))} )}
{tabs.length === 0 && (
点击右上角按钮创建终端
)} {tabs.map((tab) => ( ))}
); }