import { useEffect, useState } from 'react' // 键盘弹出时的"插入量": window.innerHeight 与 visualViewport.height 的差 // Android WebView 键盘弹出时 visualViewport 变小; 用它把底部弹层的内容抬到键盘上方, // 避免输入框(如任务详情里的"添加子任务")被键盘遮挡。 // 阈值 90px 过滤掉地址栏收起之类的轻微抖动; 无 visualViewport 时恒为 0 (iOS 原生键盘通常整体缩放, 无需处理)。 export default function useKeyboardInset() { const [inset, setInset] = useState(0) useEffect(() => { const vv = window.visualViewport if (!vv) return const onChange = () => { const diff = window.innerHeight - vv.height - vv.offsetTop setInset(diff > 90 ? Math.round(diff) : 0) } vv.addEventListener('resize', onChange) vv.addEventListener('scroll', onChange) onChange() return () => { vv.removeEventListener('resize', onChange) vv.removeEventListener('scroll', onChange) } }, []) return inset }