Files
overleaf-cep/services/web/frontend/js/features/ide-react/components/rail/rail-panel.tsx
T
Alexandre BourdinandAnna Fields c8a3bdd13f [web] Add a focus mode to the editor (#32245)
* Basic focus mode implementation

* Exit button

* Toggle between editor pdf mode

* Keep the rail and file tree mounted for editor tabs to work properly

* Hide Switch to editor button in focus mode

* Show shortcuts in layout menu

* Gate the feature behind a focus-mode feature flag

* Add split test badges in the focus mode dropdown item and top bar

* Add analytics tracking for focusMode changes

* Cleanup leftover IdeView value

* Allow passing focusMode value in layout test provider

* Remove redundant listener for focus mode shortcut

* Update focus mode and full project search listeners to use the event key

* Post-rebase cleanup

---------

Co-authored-by: Anna Fields <acfields11@gmail.com>
GitOrigin-RevId: 207f8d136fa6662558c474cca4a867a9842191e7
2026-06-08 08:06:05 +00:00

73 lines
2.1 KiB
TypeScript

import { Panel } from 'react-resizable-panels'
import { useRailContext } from '@/features/ide-react/context/rail-context'
import classNames from 'classnames'
import { useCallback, useMemo } from 'react'
import usePreviousValue from '@/shared/hooks/use-previous-value'
import { HistorySidebar } from '@/features/ide-react/components/history-sidebar'
import { Tab } from 'react-bootstrap'
import { RailElement } from '@/features/ide-react/util/rail-types'
import { shouldIncludeElement } from '@/features/ide-react/util/rail-utils'
export default function RailPanel({
isReviewPanelOpen,
isHistoryView,
railTabs,
focusMode,
}: {
isReviewPanelOpen: boolean
isHistoryView: boolean
railTabs: RailElement[]
focusMode: boolean
}) {
const { selectedTab, panelRef, handlePaneExpand, handlePaneCollapse } =
useRailContext()
const prevTab = usePreviousValue(selectedTab)
const tabHasChanged = useMemo(() => {
return prevTab !== selectedTab
}, [prevTab, selectedTab])
const onCollapse = useCallback(() => {
if (!tabHasChanged) {
handlePaneCollapse()
}
}, [tabHasChanged, handlePaneCollapse])
return (
<Panel
id={`ide-redesign-sidebar-panel-${isHistoryView ? 'file-tree' : selectedTab}`}
className={classNames({ hidden: isReviewPanelOpen || focusMode })}
order={1}
defaultSize={selectedTab === 'workbench' ? 20 : 15}
minSize={5}
maxSize={80}
ref={panelRef}
collapsible
onCollapse={onCollapse}
onExpand={handlePaneExpand}
>
{isHistoryView && <HistorySidebar />}
<div
className={classNames('ide-rail-content', {
hidden: isHistoryView,
})}
>
<Tab.Content className="ide-rail-tab-content">
{railTabs
.filter(shouldIncludeElement)
.map(({ key, component, mountOnFirstLoad }) => (
<Tab.Pane
eventKey={key}
key={key}
mountOnEnter={!mountOnFirstLoad}
>
{component}
</Tab.Pane>
))}
</Tab.Content>
</div>
</Panel>
)
}