import { useEffect, useMemo } from 'react'; import { useRainbowThemeContext } from '../shared/RainbowThemeProvider'; import { useToolWorkflow } from '../../contexts/ToolWorkflowContext'; import { usePreferences } from '../../contexts/PreferencesContext'; import ToolPicker from './ToolPicker'; import SearchResults from './SearchResults'; import ToolRenderer from './ToolRenderer'; import ToolSearch from './toolPicker/ToolSearch'; import { useSidebarContext } from "../../contexts/SidebarContext"; import rainbowStyles from '../../styles/rainbow.module.css'; import { ActionIcon, ScrollArea } from '@mantine/core'; import { ToolId } from '../../types/toolId'; import { useMediaQuery } from '@mantine/hooks'; import DoubleArrowIcon from '@mui/icons-material/DoubleArrow'; import { useTranslation } from 'react-i18next'; import FullscreenToolSurface from './FullscreenToolSurface'; import { useToolPanelGeometry } from '../../hooks/tools/useToolPanelGeometry'; import { useRightRail } from '../../contexts/RightRailContext'; import { Tooltip } from '../shared/Tooltip'; import './ToolPanel.css'; // No props needed - component uses context export default function ToolPanel() { const { t } = useTranslation(); const { isRainbowMode } = useRainbowThemeContext(); const { sidebarRefs } = useSidebarContext(); const { toolPanelRef, quickAccessRef, rightRailRef } = sidebarRefs; const isMobile = useMediaQuery('(max-width: 1024px)'); const { leftPanelView, isPanelVisible, searchQuery, filteredTools, toolRegistry, setSearchQuery, selectedToolKey, handleToolSelect, setPreviewFile, toolPanelMode, setToolPanelMode, setLeftPanelView, readerMode, } = useToolWorkflow(); const { setAllRightRailButtonsDisabled } = useRightRail(); const { preferences, updatePreference } = usePreferences(); const isFullscreenMode = toolPanelMode === 'fullscreen'; const toolPickerVisible = !readerMode; const fullscreenExpanded = isFullscreenMode && leftPanelView === 'toolPicker' && !isMobile && toolPickerVisible; // Disable right rail buttons when fullscreen mode is active useEffect(() => { setAllRightRailButtonsDisabled(fullscreenExpanded); }, [fullscreenExpanded, setAllRightRailButtonsDisabled]); const fullscreenGeometry = useToolPanelGeometry({ enabled: fullscreenExpanded, toolPanelRef, quickAccessRef, rightRailRef, }); const toggleLabel = isFullscreenMode ? t('toolPanel.toggle.sidebar', 'Switch to sidebar mode') : t('toolPanel.toggle.fullscreen', 'Switch to fullscreen mode'); const handleModeToggle = () => { const nextMode = isFullscreenMode ? 'sidebar' : 'fullscreen'; setToolPanelMode(nextMode); if (nextMode === 'fullscreen' && leftPanelView !== 'toolPicker') { setLeftPanelView('toolPicker'); } }; const computedWidth = () => { if (isMobile) { return '100%'; } if (!isPanelVisible) { return '0'; } return '18.5rem'; }; const matchedTextMap = useMemo(() => { const map = new Map(); filteredTools.forEach(({ item: [id], matchedText }) => { if (matchedText) { map.set(id, matchedText); } }); return map; }, [filteredTools]); return (
{!fullscreenExpanded && (
{!isMobile && leftPanelView === 'toolPicker' && ( )}
{searchQuery.trim().length > 0 ? (
handleToolSelect(id as ToolId)} searchQuery={searchQuery} />
) : leftPanelView === 'toolPicker' ? (
handleToolSelect(id as ToolId)} filteredTools={filteredTools} isSearching={Boolean(searchQuery && searchQuery.trim().length > 0)} />
) : (
{selectedToolKey ? ( ) : (
{t('toolPanel.placeholder', 'Choose a tool to get started')}
)}
)}
)} {fullscreenExpanded && ( handleToolSelect(id)} onToggleDescriptions={() => updatePreference('showLegacyToolDescriptions', !preferences.showLegacyToolDescriptions)} onExitFullscreenMode={() => setToolPanelMode('sidebar')} toggleLabel={toggleLabel} geometry={fullscreenGeometry} /> )}
); }