feat(app-expo): 聊天键盘与列表滚动改用 keyboard-controller,并收敛 Web 构建配置

聊天(conversation/[id])
- 根布局挂载 KeyboardProvider,会话页使用 react-native-keyboard-controller 的
  KeyboardAvoidingView(padding + 仅文字模式 enabled),替代手写 keyboardLift 与
  RN KeyboardAvoidingView 分端逻辑,改善 Android 键盘遮挡与布局一致性。
- 键盘:keyboardDidShow 后 scrollToEnd;iOS 用 keyboardWillShow 提前更新键盘可见状态;
  收起使用 WillHide/DidHide;监听在 effect 中统一移除。
- 输入框高度:ChatInputBar 通过 onInputDisplayHeightChange 在 inputDisplayHeight 变化时
  触发滚到底;保留底部容器 onLayout 以覆盖连接提示与整块高度变化。

配置与构建
- app.config:移除 web 块与 expo-sqlite Web 所需的 COEP/COOP headers;expo-router 插件
  改为无参;Android 显式 softwareKeyboardLayoutMode: resize。
- metro.config:移除 wasm 资源与 COOP/COOP dev server
OC
This commit is contained in:
Kevin
2026-03-23 14:20:12 +08:00
parent f58adb9670
commit 62de478368
9 changed files with 90 additions and 219 deletions

View File

@@ -3,29 +3,6 @@ const { withNativeWind } = require('nativewind/metro');
const config = getDefaultConfig(__dirname);
// --- Web: Required for expo-sqlite ---
// expo-sqlite on web uses SQLite compiled to WASM; Metro must treat .wasm as an asset.
if (!config.resolver.assetExts.includes('wasm')) {
config.resolver.assetExts.push('wasm');
}
// --- Web: Required for expo-sqlite ---
// SharedArrayBuffer (used by SQLite WASM) requires COEP/COOP headers.
// Dev server: set here. Production: set via app.config.js expo-router headers.
config.server = config.server ?? {};
const existingEnhanceMiddleware = config.server.enhanceMiddleware;
config.server.enhanceMiddleware = (middleware, server) => {
const nextMiddleware = existingEnhanceMiddleware
? existingEnhanceMiddleware(middleware, server)
: middleware;
return (req, res, next) => {
res.setHeader('Cross-Origin-Embedder-Policy', 'credentialless');
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
return nextMiddleware(req, res, next);
};
};
module.exports = withNativeWind(config, {
input: './src/global.css',
inlineRem: 16,