|
@@ -1,6 +1,7 @@
|
|
|
import { useLayoutContext } from '@/shared/context/layout-context'
|
|
import { useLayoutContext } from '@/shared/context/layout-context'
|
|
|
import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
|
|
import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
|
|
|
-import { useCallback, useRef, useState } from 'react'
|
|
|
|
|
|
|
+import useDebounce from '@/shared/hooks/use-debounce'
|
|
|
|
|
+import { useCallback, useEffect, useRef, useState } from 'react'
|
|
|
import { ImperativePanelHandle } from 'react-resizable-panels'
|
|
import { ImperativePanelHandle } from 'react-resizable-panels'
|
|
|
|
|
|
|
|
export const useChatPane = () => {
|
|
export const useChatPane = () => {
|
|
@@ -8,6 +9,17 @@ export const useChatPane = () => {
|
|
|
const [resizing, setResizing] = useState(false)
|
|
const [resizing, setResizing] = useState(false)
|
|
|
const panelRef = useRef<ImperativePanelHandle>(null)
|
|
const panelRef = useRef<ImperativePanelHandle>(null)
|
|
|
|
|
|
|
|
|
|
+ // Keep track of a debounced local state variable for panel openness and
|
|
|
|
|
+ // only update the external openness state when the debounced value changes.
|
|
|
|
|
+ // This prevents successive calls to onCollapse and onExpand from
|
|
|
|
|
+ // react-resizable-panels updating the openness state multiple times in quick
|
|
|
|
|
+ // succession, which causes confusing behaviour that is different in React 17
|
|
|
|
|
+ // and 18. Collapsing the chat pane on initialization is necessary because
|
|
|
|
|
+ // react-resizable-panels does not provide a way to specify both that a panel
|
|
|
|
|
+ // should be collapsed and a default size for the panel when expanded.
|
|
|
|
|
+ const [localIsOpen, setLocalIsOpen] = useState(isOpen)
|
|
|
|
|
+ const debouncedLocalIsOpen = useDebounce(localIsOpen, 100)
|
|
|
|
|
+
|
|
|
useCollapsiblePanel(isOpen, panelRef)
|
|
useCollapsiblePanel(isOpen, panelRef)
|
|
|
|
|
|
|
|
const togglePane = useCallback(() => {
|
|
const togglePane = useCallback(() => {
|
|
@@ -15,12 +27,16 @@ export const useChatPane = () => {
|
|
|
}, [setIsOpen])
|
|
}, [setIsOpen])
|
|
|
|
|
|
|
|
const handlePaneExpand = useCallback(() => {
|
|
const handlePaneExpand = useCallback(() => {
|
|
|
- setIsOpen(true)
|
|
|
|
|
- }, [setIsOpen])
|
|
|
|
|
|
|
+ setLocalIsOpen(true)
|
|
|
|
|
+ }, [])
|
|
|
|
|
|
|
|
const handlePaneCollapse = useCallback(() => {
|
|
const handlePaneCollapse = useCallback(() => {
|
|
|
- setIsOpen(false)
|
|
|
|
|
- }, [setIsOpen])
|
|
|
|
|
|
|
+ setLocalIsOpen(false)
|
|
|
|
|
+ }, [])
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ setIsOpen(debouncedLocalIsOpen)
|
|
|
|
|
+ }, [debouncedLocalIsOpen, setIsOpen])
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
isOpen,
|
|
isOpen,
|