import React, { useState, useRef, useCallback } from "react"; export interface TerminalSessionInfo { id: string; name: string; status: "connecting" | "connected" | "disconnected" | "error" | "resetting"; } export interface TerminalSessionTabsProps { sessions: TerminalSessionInfo[]; activeSessionId: string; onSelect: (sessionId: string) => void; onClose: (sessionId: string) => void; onCreate: () => void; onRename: (sessionId: string, newName: string) => void; isMobile?: boolean; } export const TerminalSessionTabs: React.FC = ({ sessions, activeSessionId, onSelect, onClose, onCreate, onRename, isMobile = false, }) => { const [renamingId, setRenamingId] = useState(null); const [renameValue, setRenameValue] = useState(""); const [confirmCloseId, setConfirmCloseId] = useState(null); const renameInputRef = useRef(null); const scrollRef = useRef(null); const handleDoubleClick = useCallback((session: TerminalSessionInfo) => { setRenamingId(session.id); setRenameValue(session.name); requestAnimationFrame(() => { renameInputRef.current?.focus(); renameInputRef.current?.select(); }); }, []); const commitRename = useCallback(() => { if (renamingId && renameValue.trim()) { onRename(renamingId, renameValue.trim()); } setRenamingId(null); setRenameValue(""); }, [renamingId, renameValue, onRename]); const cancelRename = useCallback(() => { setRenamingId(null); setRenameValue(""); }, []); const handleRenameKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === "Enter") { commitRename(); } else if (e.key === "Escape") { cancelRename(); } }, [commitRename, cancelRename], ); const handleCloseClick = useCallback( (e: React.MouseEvent, sessionId: string) => { e.stopPropagation(); if (confirmCloseId === sessionId) { setConfirmCloseId(null); onClose(sessionId); } else { setConfirmCloseId(sessionId); // Auto-dismiss confirm after 3s setTimeout(() => { setConfirmCloseId((prev) => (prev === sessionId ? null : prev)); }, 3000); } }, [confirmCloseId, onClose], ); const isMaxSessions = sessions.length >= 5; return (
{sessions.map((session) => { const isActive = session.id === activeSessionId; const isRenaming = renamingId === session.id; const isConfirmingClose = confirmCloseId === session.id; return (
onSelect(session.id)} onDoubleClick={() => handleDoubleClick(session)} title={isRenaming ? "" : `${session.name} (${session.status})`} >
); })}
); };