Fix keyboard detection using focus events instead of visualViewport

This commit is contained in:
PEDZEO
2026-01-21 02:21:57 +03:00
parent fb46c84b58
commit b7e6ee490c

View File

@@ -210,23 +210,32 @@ export default function Layout({ children }: LayoutProps) {
} }
}, [mobileMenuOpen]) }, [mobileMenuOpen])
// Detect virtual keyboard open/close using visualViewport API // Detect virtual keyboard by tracking focus on input elements
useEffect(() => { useEffect(() => {
const viewport = window.visualViewport const handleFocusIn = (e: FocusEvent) => {
if (!viewport) return const target = e.target as HTMLElement
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
const handleResize = () => { setIsKeyboardOpen(true)
// Keyboard is considered open if viewport height is significantly smaller than window height }
const heightDiff = window.innerHeight - viewport.height
setIsKeyboardOpen(heightDiff > 150)
} }
viewport.addEventListener('resize', handleResize) const handleFocusOut = (e: FocusEvent) => {
viewport.addEventListener('scroll', handleResize) const relatedTarget = e.relatedTarget as HTMLElement | null
// Only close if not focusing another input
if (!relatedTarget ||
(relatedTarget.tagName !== 'INPUT' &&
relatedTarget.tagName !== 'TEXTAREA' &&
!relatedTarget.isContentEditable)) {
setIsKeyboardOpen(false)
}
}
document.addEventListener('focusin', handleFocusIn)
document.addEventListener('focusout', handleFocusOut)
return () => { return () => {
viewport.removeEventListener('resize', handleResize) document.removeEventListener('focusin', handleFocusIn)
viewport.removeEventListener('scroll', handleResize) document.removeEventListener('focusout', handleFocusOut)
} }
}, []) }, [])