import React, { useState, useCallback } from "react"; import { SegmentedControl, Loader } from "@mantine/core"; import { useRainbowThemeContext } from "./RainbowThemeProvider"; import rainbowStyles from '../../styles/rainbow.module.css'; import VisibilityIcon from "@mui/icons-material/Visibility"; import EditNoteIcon from "@mui/icons-material/EditNote"; import FolderIcon from "@mui/icons-material/Folder"; import { ModeType, isValidMode } from '../../contexts/NavigationContext'; import { Tooltip } from "./Tooltip"; const viewOptionStyle = { display: 'inline-flex', flexDirection: 'row', alignItems: 'center', gap: 6, whiteSpace: 'nowrap', paddingTop: '0.3rem', } // Build view options showing text only for current view; others icon-only with tooltip const createViewOptions = (currentView: ModeType, switchingTo: ModeType | null) => [ { label: (
{switchingTo === "viewer" ? ( ) : ( )} Viewer
), value: "viewer", }, { label: (
{currentView === "pageEditor" ? ( <> {switchingTo === "pageEditor" ? : } Page Editor ) : ( switchingTo === "pageEditor" ? : )}
), value: "pageEditor", }, { label: (
{currentView === "fileEditor" ? ( <> {switchingTo === "fileEditor" ? : } Active Files ) : ( switchingTo === "fileEditor" ? : )}
), value: "fileEditor", }, ]; interface TopControlsProps { currentView: ModeType; setCurrentView: (view: ModeType) => void; selectedToolKey?: string | null; } const TopControls = ({ currentView, setCurrentView, selectedToolKey, }: TopControlsProps) => { const { isRainbowMode } = useRainbowThemeContext(); const [switchingTo, setSwitchingTo] = useState(null); const isToolSelected = selectedToolKey !== null; const handleViewChange = useCallback((view: string) => { if (!isValidMode(view)) { // Ignore invalid values defensively return; } const mode = view as ModeType; // Show immediate feedback setSwitchingTo(mode as ModeType); // Defer the heavy view change to next frame so spinner can render requestAnimationFrame(() => { // Give the spinner one more frame to show requestAnimationFrame(() => { setCurrentView(mode as ModeType); // Clear the loading state after view change completes setTimeout(() => setSwitchingTo(null), 300); }); }); }, [setCurrentView]); return (
{!isToolSelected && (
)}
); }; export default TopControls;