Skip to content

Commit 3c0cb60

Browse files
committed
fix: prevent editor toolbar from opening during sheet switch
1 parent f3af6f2 commit 3c0cb60

2 files changed

Lines changed: 41 additions & 6 deletions

File tree

packages/webapp/components/pages/document/components/MobileEditor.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useEffect, useRef, useState } from 'react'
22
import EditorContent from './EditorContent'
33
import ToolbarMobile from './toolbarMobile/ToolbarMobile'
4-
import { useChatStore, useStore } from '@stores'
4+
import { useChatStore, useStore, useSheetStore } from '@stores'
55
import { useAdjustEditorSizeForChatRoom } from '../hooks'
66
import useEditableDocControl from '@components/pages/document/hooks/useEditableDocControl'
77
import usePageHeightAdjust from '@components/pages/document/hooks/usePageHeightAdjust'
@@ -12,8 +12,9 @@ const Editor = () => {
1212
const editorWrapperRef = useRef<HTMLDivElement>(null)
1313

1414
const chatRoom = useChatStore((state) => state.chatRoom)
15+
const { activeSheet, pendingSheet } = useSheetStore((state) => state)
1516

16-
const { isKeyboardOpen } = useStore((state) => state)
17+
const { isKeyboardOpen, virtualKeyboardState } = useStore((state) => state)
1718

1819
// @ts-ignore
1920
useAdjustEditorSizeForChatRoom(editorWrapperRef)
@@ -37,7 +38,9 @@ const Editor = () => {
3738

3839
<div
3940
className={`toolbars bg-base-100 z-10 w-full ${
40-
isKeyboardOpen && !chatRoom?.headingId ? 'block' : 'hidden'
41+
isKeyboardOpen && !chatRoom?.headingId && !activeSheet && !pendingSheet
42+
? 'block'
43+
: 'hidden'
4144
}`}>
4245
<ToolbarMobile />
4346
</div>

packages/webapp/hooks/useVirtualKeyboard.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import { useEffect } from 'react'
1+
import { useEffect, useRef } from 'react'
22
import { useStore } from '@stores'
33

44
const useVirtualKeyboard = () => {
55
const { setKeyboardOpen, setKeyboardHeight, setVirtualKeyboardState } = useStore((state) => state)
6+
const previousIsOpenRef = useRef<boolean | null>(null)
7+
const transitionTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined)
68

79
useEffect(() => {
810
const visualViewport = window.visualViewport
911

1012
if (!visualViewport) {
11-
// Fallback for browsers without Visual Viewport API
1213
return
1314
}
1415

@@ -17,10 +18,38 @@ const useVirtualKeyboard = () => {
1718
const viewportHeight = visualViewport.height
1819
const keyboardHeight = windowHeight - viewportHeight
1920
const isKeyboardOpen = keyboardHeight > 0
21+
const previousIsOpen = previousIsOpenRef.current
2022

2123
setKeyboardOpen(isKeyboardOpen)
2224
setKeyboardHeight(keyboardHeight)
23-
setVirtualKeyboardState(isKeyboardOpen ? 'open' : 'closed')
25+
26+
// Clear any existing transition timeout
27+
if (transitionTimeoutRef.current) {
28+
clearTimeout(transitionTimeoutRef.current)
29+
}
30+
31+
// Determine state based on current vs previous
32+
if (previousIsOpen === null) {
33+
// Initial state - no transition
34+
setVirtualKeyboardState(isKeyboardOpen ? 'open' : 'closed')
35+
} else if (previousIsOpen === false && isKeyboardOpen === true) {
36+
// Keyboard is opening
37+
setVirtualKeyboardState('opening')
38+
transitionTimeoutRef.current = setTimeout(() => {
39+
setVirtualKeyboardState('open')
40+
}, 300) // Typical keyboard animation duration
41+
} else if (previousIsOpen === true && isKeyboardOpen === false) {
42+
// Keyboard is closing
43+
setVirtualKeyboardState('closing')
44+
transitionTimeoutRef.current = setTimeout(() => {
45+
setVirtualKeyboardState('closed')
46+
}, 300)
47+
} else {
48+
// No state change - maintain current state
49+
setVirtualKeyboardState(isKeyboardOpen ? 'open' : 'closed')
50+
}
51+
52+
previousIsOpenRef.current = isKeyboardOpen
2453
}
2554

2655
// Initial check
@@ -33,6 +62,9 @@ const useVirtualKeyboard = () => {
3362
return () => {
3463
visualViewport.removeEventListener('resize', handleViewportChange)
3564
visualViewport.removeEventListener('scroll', handleViewportChange)
65+
if (transitionTimeoutRef.current) {
66+
clearTimeout(transitionTimeoutRef.current)
67+
}
3668
}
3769
}, [])
3870
}

0 commit comments

Comments
 (0)