Use the expanded size from localStorage when available (#16298)

GitOrigin-RevId: 7747881b99d23ebb0ee38d044c671bffb7504302
This commit is contained in:
Alf Eaton
2023-12-20 11:48:24 +00:00
committed by Copybot
parent 7cb427738c
commit 5c6b8ec015
7 changed files with 52 additions and 59 deletions
@@ -9,7 +9,7 @@ import { useOutlinePane } from '@/features/ide-react/hooks/use-outline-pane'
export default function EditorSidebar() {
const { view } = useLayoutContext()
const { outlineDisabled, outlineRef } = useOutlinePane()
const { outlineEnabled, outlinePanelRef } = useOutlinePane()
return (
<aside
@@ -28,7 +28,7 @@ export default function EditorSidebar() {
<FileTree />
</Panel>
<VerticalResizeHandle disabled={outlineDisabled} />
<VerticalResizeHandle disabled={!outlineEnabled} />
<Panel
defaultSize={50}
@@ -36,7 +36,7 @@ export default function EditorSidebar() {
id="panel-outline"
order={2}
collapsible
ref={outlineRef}
ref={outlinePanelRef}
style={{ minHeight: 32 }} // keep the header visible
>
<OutlineContainer />
@@ -23,7 +23,7 @@ export const MainLayout: FC = () => {
const {
isOpen: sidebarIsOpen,
setIsOpen: setSidebarIsOpen,
fixedPanelRef: sidebarPanelRef,
panelRef: sidebarPanelRef,
handleLayout: handleSidebarLayout,
togglePane: toggleSidebar,
handlePaneExpand: handleSidebarExpand,
@@ -34,7 +34,7 @@ export const MainLayout: FC = () => {
const {
isOpen: chatIsOpen,
fixedPanelRef: chatPanelRef,
panelRef: chatPanelRef,
handleLayout: handleChatLayout,
togglePane: toggleChat,
resizing: chatResizing,
@@ -1,13 +1,16 @@
import { useLayoutContext } from '@/shared/context/layout-context'
import useFixedSizeColumn from '@/features/ide-react/hooks/use-fixed-size-column'
import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
import { useCallback, useState } from 'react'
import { useCallback, useRef, useState } from 'react'
import { ImperativePanelHandle } from 'react-resizable-panels'
export const useChatPane = () => {
const { chatIsOpen: isOpen, setChatIsOpen: setIsOpen } = useLayoutContext()
const [resizing, setResizing] = useState(false)
const { fixedPanelRef, handleLayout } = useFixedSizeColumn(isOpen)
useCollapsiblePanel(isOpen, fixedPanelRef)
const panelRef = useRef<ImperativePanelHandle>(null)
const handleLayout = useFixedSizeColumn(isOpen, panelRef)
useCollapsiblePanel(isOpen, panelRef)
const togglePane = useCallback(() => {
setIsOpen(value => !value)
@@ -23,7 +26,7 @@ export const useChatPane = () => {
return {
isOpen,
fixedPanelRef,
panelRef,
handleLayout,
resizing,
setResizing,
@@ -5,12 +5,29 @@ export default function useCollapsiblePanel(
panelIsOpen: boolean,
panelRef: RefObject<ImperativePanelHandle>
) {
// store the expanded height in localStorage when collapsing,
// so it can be restored when expanding after reloading the page
useEffect(() => {
if (panelRef.current) {
if (panelIsOpen) {
panelRef.current.expand()
const panelHandle = panelRef.current
if (panelHandle) {
const storageKey = `ide-panel.expanded-size.${panelHandle.getId()}`
if (!panelIsOpen) {
// collapsing, so store the current size if > 0
const size = panelHandle.getSize()
if (size > 0) {
localStorage.setItem(storageKey, String(size))
}
panelHandle.collapse()
} else {
panelRef.current.collapse()
const storedKey = localStorage.getItem(storageKey)
if (storedKey) {
panelHandle.resize(Number(storedKey))
} else {
panelHandle.expand()
}
}
}
}, [panelIsOpen, panelRef])
@@ -1,12 +1,13 @@
import { useCallback, useEffect, useRef, useState } from 'react'
import { RefObject, useCallback, useEffect, useRef, useState } from 'react'
import {
ImperativePanelHandle,
PanelGroupOnLayout,
} from 'react-resizable-panels'
export default function useFixedSizeColumn(isOpen: boolean) {
const fixedPanelRef = useRef<ImperativePanelHandle>(null)
export default function useFixedSizeColumn(
isOpen: boolean,
fixedPanelRef: RefObject<ImperativePanelHandle>
) {
const fixedPanelSizeRef = useRef<number>(0)
const [initialLayoutDone, setInitialLayoutDone] = useState(false)
@@ -15,7 +16,7 @@ export default function useFixedSizeColumn(isOpen: boolean) {
fixedPanelSizeRef.current = fixedPanelRef.current.getSize()
setInitialLayoutDone(true)
}
}, [])
}, [fixedPanelRef])
useEffect(() => {
if (!isOpen) {
@@ -51,5 +52,5 @@ export default function useFixedSizeColumn(isOpen: boolean) {
return () => resizeObserver.unobserve(panelGroupElement)
}, [fixedPanelRef, initialLayoutDone, isOpen])
return { fixedPanelRef, handleLayout }
return handleLayout
}
@@ -1,44 +1,14 @@
import { useOutlineContext } from '@/features/ide-react/context/outline-context'
import { useProjectContext } from '@/shared/context/project-context'
import { useEffect, useRef } from 'react'
import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
import { useRef } from 'react'
import { ImperativePanelHandle } from 'react-resizable-panels'
import localStorage from '@/infrastructure/local-storage'
export const useOutlinePane = () => {
const { canShowOutline, outlineExpanded } = useOutlineContext()
const { _id: projectId } = useProjectContext()
const outlineDisabled = !canShowOutline || !outlineExpanded
const outlinePanelRef = useRef<ImperativePanelHandle>(null)
const outlineEnabled = canShowOutline && outlineExpanded
const outlineRef = useRef<ImperativePanelHandle>(null)
useCollapsiblePanel(outlineEnabled, outlinePanelRef)
// store the expanded height in localStorage when collapsing,
// so it can be restored when expanding after reloading the page
useEffect(() => {
const outlinePane = outlineRef.current
if (outlinePane) {
// NOTE: outline size is shared across projects
const storageKey = 'ide-panel.outline.size'
if (outlineDisabled) {
// collapsing, so store the current size if > 0
const size = outlinePane.getSize()
if (size > 0) {
localStorage.setItem(storageKey, size)
}
outlinePane.collapse()
} else {
outlinePane.expand()
// if the panel has been expanded to zero height, use the stored height instead
if (outlinePane.getSize() === 0) {
const size = Number(localStorage.getItem(storageKey) || 50)
outlinePane.resize(size)
}
}
}
}, [outlineDisabled, projectId])
return { outlineDisabled, outlineRef }
return { outlineEnabled, outlinePanelRef }
}
@@ -1,12 +1,14 @@
import { useCallback, useState } from 'react'
import { useCallback, useRef, useState } from 'react'
import useFixedSizeColumn from '@/features/ide-react/hooks/use-fixed-size-column'
import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
import { ImperativePanelHandle } from 'react-resizable-panels'
export const useSidebarPane = () => {
const [isOpen, setIsOpen] = useState(true)
const [resizing, setResizing] = useState(false)
const { fixedPanelRef, handleLayout } = useFixedSizeColumn(isOpen)
useCollapsiblePanel(isOpen, fixedPanelRef)
const panelRef = useRef<ImperativePanelHandle>(null)
const handleLayout = useFixedSizeColumn(isOpen, panelRef)
useCollapsiblePanel(isOpen, panelRef)
const togglePane = useCallback(() => {
setIsOpen(value => !value)
@@ -23,7 +25,7 @@ export const useSidebarPane = () => {
return {
isOpen,
setIsOpen,
fixedPanelRef,
panelRef,
handleLayout,
togglePane,
handlePaneExpand,