fix(web): prevent mobile keyboard from covering chat input (#403)

This commit is contained in:
Haoqing Wang
2026-04-06 05:39:40 +08:00
committed by GitHub
parent ea09663cdc
commit 1c8cb5c90d
4 changed files with 116 additions and 1 deletions
+63
View File
@@ -0,0 +1,63 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
/**
* Unit tests for the useViewportHeight hook logic.
*
* Because the hook depends on window.visualViewport (not available in jsdom),
* we test the core update logic directly rather than rendering the hook.
*/
describe('useViewportHeight update logic', () => {
const root = document.documentElement
beforeEach(() => {
root.style.removeProperty('--app-viewport-height')
})
afterEach(() => {
root.style.removeProperty('--app-viewport-height')
})
it('sets --app-viewport-height when visual viewport is smaller than window', () => {
// Simulate the update logic from the hook
const viewportHeight = 400
const windowHeight = 800
const diff = windowHeight - viewportHeight
if (diff > 1) {
root.style.setProperty('--app-viewport-height', `${viewportHeight}px`)
} else {
root.style.removeProperty('--app-viewport-height')
}
expect(root.style.getPropertyValue('--app-viewport-height')).toBe('400px')
})
it('removes --app-viewport-height when viewports match', () => {
// First set it
root.style.setProperty('--app-viewport-height', '400px')
// Then simulate keyboard close
const viewportHeight = 800
const windowHeight = 800
const diff = windowHeight - viewportHeight
if (diff > 1) {
root.style.setProperty('--app-viewport-height', `${viewportHeight}px`)
} else {
root.style.removeProperty('--app-viewport-height')
}
expect(root.style.getPropertyValue('--app-viewport-height')).toBe('')
})
it('ignores sub-pixel differences (threshold of 1px)', () => {
const viewportHeight = 799.5
const windowHeight = 800
const diff = windowHeight - viewportHeight
if (diff > 1) {
root.style.setProperty('--app-viewport-height', `${viewportHeight}px`)
} else {
root.style.removeProperty('--app-viewport-height')
}
expect(root.style.getPropertyValue('--app-viewport-height')).toBe('')
})
})