import React from 'react'; import type { useI18n } from '../../application/i18n/I18nProvider'; import type { Host, TerminalSession } from '../../types'; import { ContextMenuContent, ContextMenuItem } from '../ui/context-menu'; type TranslateFn = ReturnType['t']; interface SessionTabContextMenuContentProps { sessionId: string; onCloseSession: (sessionId: string) => void; onCopySession?: (sessionId: string) => void; /** Duplicate the session with a brand-new connection (fresh auth, e.g. a new bastion login). */ onDuplicateSession?: (sessionId: string) => void; onCopySessionToNewWindow?: (sessionId: string) => void; onDetachSession?: (sessionId: string) => void; onReconnectSession: (sessionId: string) => void; sessionStatus: TerminalSession['status']; reconnectActive?: boolean; onRenameSession: (sessionId: string) => void; /** Vault host for this session; omit edit when missing (e.g. local shell). */ editHost?: Host; onEditHost?: (host: Host) => void; renderBulkCloseItems?: (anchorId: string) => React.ReactNode; t: TranslateFn; } export function SessionTabContextMenuContent({ sessionId, onCloseSession, onCopySession, onDuplicateSession, onCopySessionToNewWindow, onDetachSession, onReconnectSession, sessionStatus, reconnectActive = false, onRenameSession, editHost, onEditHost, renderBulkCloseItems, t, }: SessionTabContextMenuContentProps) { return ( onReconnectSession(sessionId)} > {t('terminal.menu.reconnect')} onRenameSession(sessionId)}> {t('common.rename')} {editHost && onEditHost && ( onEditHost(editHost)}> {t('terminal.layer.hostTree.editHost')} )} {onCopySession && ( onCopySession(sessionId)}> {t('tabs.copyTab')} )} {onDuplicateSession && ( onDuplicateSession(sessionId)}> {t('tabs.duplicateSession')} )} {onCopySessionToNewWindow && ( onCopySessionToNewWindow(sessionId)}> {t('tabs.copyTabToNewWindow')} )} {onDetachSession && ( onDetachSession(sessionId)}> {t('terminal.menu.detach')} )} onCloseSession(sessionId)}> {t('common.close')} {renderBulkCloseItems?.(sessionId)} ); } export const isSessionReconnectDisabled = ( status: TerminalSession['status'], reconnectActive = false, ): boolean => ( status === 'connecting' || reconnectActive );