diff --git a/src/hooks/use-keyboard-height/__tests__/environment.test.ts b/src/hooks/use-keyboard-height/__tests__/environment.test.ts new file mode 100644 index 00000000..5e28b450 --- /dev/null +++ b/src/hooks/use-keyboard-height/__tests__/environment.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest"; + +import { shouldEnableKeyboardAdaptation } from "../environment"; +import type { KeyboardAdaptEnvironment } from "../types"; + +function makeEnvironment( + overrides: Partial = {}, +): KeyboardAdaptEnvironment { + return { + platform: "android", + osName: "Android", + osVersion: "16", + deviceVendor: "Xiaomi", + deviceModel: "2211133C", + isAndroid: true, + isIOS: false, + isMobile: true, + browserName: "Facebook", + browserVersion: "566.0.0.48.73", + isInAppBrowser: true, + inAppBrowserName: "facebook", + isXiaomiFamilyDevice: true, + isFacebookInAppBrowser: true, + hasVisualViewport: true, + hasVirtualKeyboard: true, + usesXiaomiFacebookFallback: true, + ...overrides, + }; +} + +describe("shouldEnableKeyboardAdaptation", () => { + it("enables only for Xiaomi Android Facebook in-app browser fallback", () => { + expect(shouldEnableKeyboardAdaptation(makeEnvironment())).toBe(true); + + expect( + shouldEnableKeyboardAdaptation( + makeEnvironment({ + platform: "ios", + osName: "iOS", + osVersion: "18", + deviceVendor: "Apple", + deviceModel: "iPhone", + isAndroid: false, + isIOS: true, + isXiaomiFamilyDevice: false, + usesXiaomiFacebookFallback: false, + }), + ), + ).toBe(false); + + expect( + shouldEnableKeyboardAdaptation( + makeEnvironment({ + browserName: "Instagram", + inAppBrowserName: "instagram", + isFacebookInAppBrowser: false, + usesXiaomiFacebookFallback: false, + }), + ), + ).toBe(false); + + expect( + shouldEnableKeyboardAdaptation( + makeEnvironment({ + deviceVendor: "Samsung", + deviceModel: "SM-G991B", + isXiaomiFamilyDevice: false, + usesXiaomiFacebookFallback: false, + }), + ), + ).toBe(false); + }); +}); diff --git a/src/hooks/use-keyboard-height/environment.ts b/src/hooks/use-keyboard-height/environment.ts index c16277ae..0b2d3736 100644 --- a/src/hooks/use-keyboard-height/environment.ts +++ b/src/hooks/use-keyboard-height/environment.ts @@ -37,10 +37,11 @@ export function getKeyboardAdaptEnvironment( export function shouldEnableKeyboardAdaptation( environment: KeyboardAdaptEnvironment, ): boolean { - return environment.isInAppBrowser; + return environment.usesXiaomiFacebookFallback; } export function shouldUseInAppKeyboardFallback(): boolean { if (typeof navigator === "undefined") return false; - return getKeyboardAdaptEnvironment(navigator.userAgent).usesXiaomiFacebookFallback; + return getKeyboardAdaptEnvironment(navigator.userAgent) + .usesXiaomiFacebookFallback; } diff --git a/src/hooks/use-keyboard-height/index.ts b/src/hooks/use-keyboard-height/index.ts index 256d9f95..922e4d1e 100644 --- a/src/hooks/use-keyboard-height/index.ts +++ b/src/hooks/use-keyboard-height/index.ts @@ -2,7 +2,7 @@ /** * 软键盘避让 hook。 * - * 目标环境:小米系设备上的 Facebook IAB 等软键盘覆盖页面但 viewport 信号不稳定的浏览器。 + * 目标环境:小米系 Android 设备上的 Facebook IAB。 * * 策略: * 1. 持续写入 --app-viewport-height,聊天页高度不再只依赖 100dvh。 @@ -87,7 +87,7 @@ export function useKeyboardHeight({ if (!shouldEnableKeyboardAdaptation(environment)) { resetKeyboardVars(); log.debug("[keyboard] disabled", { - reason: "regular-browser", + reason: "not-xiaomi-facebook-iab", environment, }); return;