import { useEffect, useRef } from 'react' import ReactDOM from 'react-dom' import { useTranslation } from 'react-i18next' import { Dropdown, DropdownDivider, DropdownItem, DropdownMenu, } from '@/shared/components/dropdown/dropdown-menu' import { useTabsContext } from '@/features/ide-react/context/tabs-context' export function TabsContextMenu() { const { t } = useTranslation() const { tabs, closeTab, closeOtherTabs, closeToRight, contextMenuTarget, setContextMenuTarget, } = useTabsContext() const menuRef = useRef(null) // Close the context menu when opening another one useEffect(() => { if (!contextMenuTarget) return const handler = (event: MouseEvent) => { if (event.button !== 2) return const target = event.target as Element | null // Right-clicking another tab should re-open the menu on that tab; // its onContextMenu handler will set the new target. if (target?.closest('.context-menu')) return if (target?.closest('.editor-file-tab')) return setContextMenuTarget(null) } // Listen on mousedown (not contextmenu) so we still close when another // component's handler calls preventDefault on the contextmenu event. document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, [contextMenuTarget, setContextMenuTarget]) // Move focus to the menu on open, and back to the originating tab on close. const lastTabIdRef = useRef(null) useEffect(() => { if (contextMenuTarget) { lastTabIdRef.current = contextMenuTarget.tabId menuRef.current?.querySelector('[role="menu"]')?.focus() } else if (lastTabIdRef.current) { document .querySelector(`[data-tab-id="${lastTabIdRef.current}"]`) ?.focus() lastTabIdRef.current = null } }, [contextMenuTarget]) if (!contextMenuTarget) return null const close = () => setContextMenuTarget(null) const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Tab' || event.key === 'Escape') { event.preventDefault() close() } } const handleToggle = (wantOpen: boolean) => { if (!wantOpen) close() } return ReactDOM.createPortal(
{ closeTab(contextMenuTarget.tabId) close() }} > {t('close')} { closeOtherTabs(contextMenuTarget.tabId) close() }} > {t('close_other_tabs')} { closeToRight(contextMenuTarget.tabId) close() }} > {t('close_tabs_to_the_right')} { window.dispatchEvent( new CustomEvent('ui.toggle-settings', { detail: true }) ) // focus the tab setting window.dispatchEvent( new CustomEvent('ui.focus-setting', { detail: 'editorTabs', }) ) close() }} leadingIcon="settings" > {t('tab_settings')}
, document.body ) }