mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 17:43:47 +00:00
Fix keyboard detection using focus events instead of visualViewport
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user