import React, { useState, useCallback, useMemo } from "react"; import { SegmentedControl, Loader } from "@mantine/core"; import { useRainbowThemeContext } from '@app/components/shared/RainbowThemeProvider'; import rainbowStyles from '@app/styles/rainbow.module.css'; import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile"; import GridViewIcon from "@mui/icons-material/GridView"; import FolderIcon from "@mui/icons-material/Folder"; import PictureAsPdfIcon from "@mui/icons-material/PictureAsPdf"; import { WorkbenchType, isValidWorkbench } from '@app/types/workbench'; import { PageEditorFileDropdown } from '@app/components/shared/PageEditorFileDropdown'; import type { CustomWorkbenchViewInstance } from '@app/contexts/ToolWorkflowContext'; import { FileDropdownMenu } from '@app/components/shared/FileDropdownMenu'; import { usePageEditorDropdownState, PageEditorDropdownState } from '@app/components/pageEditor/hooks/usePageEditorDropdownState'; const viewOptionStyle: React.CSSProperties = { display: 'inline-flex', flexDirection: 'row', alignItems: 'center', gap: '0.5rem', justifyContent: 'center', padding: '2px 1rem', }; // Helper function to create view options for SegmentedControl const createViewOptions = ( currentView: WorkbenchType, switchingTo: WorkbenchType | null, activeFiles: Array<{ fileId: string; name: string; versionNumber?: number }>, currentFileIndex: number, onFileSelect?: (index: number) => void, pageEditorState?: PageEditorDropdownState, customViews?: CustomWorkbenchViewInstance[] ) => { // Viewer dropdown logic const currentFile = activeFiles[currentFileIndex]; const isInViewer = currentView === 'viewer'; const fileName = currentFile?.name || ''; const viewerDisplayName = isInViewer && fileName ? fileName : 'Viewer'; const hasMultipleFiles = activeFiles.length > 1; const showViewerDropdown = isInViewer && hasMultipleFiles; const viewerOption = { label: showViewerDropdown ? ( ) : (
{switchingTo === "viewer" ? ( ) : ( )}
), value: "viewer", }; // Page Editor dropdown logic const isInPageEditor = currentView === 'pageEditor'; const hasPageEditorFiles = pageEditorState && pageEditorState.totalCount > 0; const showPageEditorDropdown = isInPageEditor && hasPageEditorFiles; const pageEditorOption = { label: showPageEditorDropdown ? ( ) : (
{switchingTo === "pageEditor" ? ( ) : ( )}
), value: "pageEditor", }; const fileEditorOption = { label: (
{switchingTo === "fileEditor" ? : }
), value: "fileEditor", }; const baseOptions = [ viewerOption, pageEditorOption, fileEditorOption, ]; const customOptions = (customViews ?? []) .filter((view) => view.data != null) .map((view) => ({ label: (
{switchingTo === view.workbenchId ? ( ) : ( view.icon || )} {view.label}
), value: view.workbenchId, })); return [...baseOptions, ...customOptions]; }; interface TopControlsProps { currentView: WorkbenchType; setCurrentView: (view: WorkbenchType) => void; customViews?: CustomWorkbenchViewInstance[]; activeFiles?: Array<{ fileId: string; name: string; versionNumber?: number }>; currentFileIndex?: number; onFileSelect?: (index: number) => void; } const TopControls = ({ currentView, setCurrentView, customViews = [], activeFiles = [], currentFileIndex = 0, onFileSelect, }: TopControlsProps) => { const { isRainbowMode } = useRainbowThemeContext(); const [switchingTo, setSwitchingTo] = useState(null); const pageEditorState = usePageEditorDropdownState(); const handleViewChange = useCallback((view: string) => { if (!isValidWorkbench(view)) { return; } const workbench = view; // Show immediate feedback setSwitchingTo(workbench); // Defer the heavy view change to next frame so spinner can render requestAnimationFrame(() => { // Give the spinner one more frame to show requestAnimationFrame(() => { setCurrentView(workbench); // Clear the loading state after view change completes setTimeout(() => setSwitchingTo(null), 300); }); }); }, [setCurrentView]); // Memoize view options to prevent SegmentedControl re-renders const viewOptions = useMemo(() => createViewOptions( currentView, switchingTo, activeFiles, currentFileIndex, onFileSelect, pageEditorState, customViews ), [currentView, switchingTo, activeFiles, currentFileIndex, onFileSelect, pageEditorState, customViews]); return (
); }; export default TopControls;