From 0aedf22659aa4d59a7b77341c8b03651f3ce3278 Mon Sep 17 00:00:00 2001 From: dimassfeb-09 Date: Sun, 6 Sep 2026 19:08:46 +0800 Subject: [PATCH 1/3] fix(chat): composer sticks above keyboard on gesture-nav Android Replace KeyboardAvoidingView (broken under Expo edge-to-edge, #147) with KeyboardStickyView from react-native-keyboard-controller. KeyboardProvider at root with translucent bars. --- app/_layout.tsx | 3 +++ app/session/[id].tsx | 25 ++++++++----------------- package.json | 1 + 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/_layout.tsx b/app/_layout.tsx index c669aac9..5fdaa3a4 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -4,6 +4,7 @@ import { StatusBar } from "expo-status-bar" import { useColorScheme, View, ActivityIndicator, AppState } from "react-native" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { GestureHandlerRootView } from "react-native-gesture-handler" +import { KeyboardProvider } from "react-native-keyboard-controller" import { BottomSheetModalProvider } from "@gorhom/bottom-sheet" import { I18nextProvider, useTranslation } from "react-i18next" import i18n from "../src/lib/i18n/config" @@ -171,6 +172,7 @@ function RootLayout() { + @@ -212,6 +214,7 @@ function RootLayout() { + {/* Telemetry consent modal — shown once on first launch */} - + + {/* Model picker bottom sheet */} Date: Sun, 6 Sep 2026 19:13:17 +0800 Subject: [PATCH 2/3] fix(chat): show Typing... instead of blank assistant card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit message.updated arrives before first part.updated — render a spinner + Typing... placeholder instead of an empty bubble that looks blank. Hides as soon as any text/reasoning/tool/file arrives. --- src/components/chat/MessageBubble.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/chat/MessageBubble.tsx b/src/components/chat/MessageBubble.tsx index 0f82ecaf..1e8b1cc2 100644 --- a/src/components/chat/MessageBubble.tsx +++ b/src/components/chat/MessageBubble.tsx @@ -1,5 +1,5 @@ import { memo } from "react" -import { View, Text, Image, StyleSheet, ScrollView, TouchableOpacity, Dimensions } from "react-native" +import { View, Text, Image, StyleSheet, ScrollView, TouchableOpacity, Dimensions, ActivityIndicator } from "react-native" import { Ionicons } from "@expo/vector-icons" import { Markdown } from "../markdown" import { ToolCallCard } from "./ToolCallCard" @@ -96,6 +96,14 @@ export const MessageBubble = memo( ))} + {/* Typing placeholder — assistant message arrived before any part */} + {!isUser && text.length === 0 && reasoning.length === 0 && toolParts.length === 0 && fileParts.length === 0 && ( + + + Typing… + + )} + {/* Tool calls */} {toolParts.map((tool) => ( @@ -170,4 +178,8 @@ const s = StyleSheet.create({ }, imageLabel: { fontSize: 10, color: "#666666", marginTop: 2, maxWidth: 200 }, imageLabelDark: { color: "#888888" }, + + typingRow: { flexDirection: "row", alignItems: "center", gap: 8, paddingVertical: 4 }, + typingText: { fontSize: 14, color: "#8b5cf6", fontStyle: "italic" }, + typingTextDark: { color: "#a78bfa" }, }) From 5863f04698c077d4a78f3285d04681ef74f200fc Mon Sep 17 00:00:00 2001 From: dimassfeb-09 Date: Sun, 6 Sep 2026 19:19:58 +0800 Subject: [PATCH 3/3] chore: sync lockfile for react-native-keyboard-controller --- package-lock.json | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a846b5c..966f71bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@opencode-ai/mobile", - "version": "0.4.11", + "version": "0.4.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@opencode-ai/mobile", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@expo/vector-icons": "^15.0.3", "@gorhom/bottom-sheet": "5.2.8", @@ -35,6 +35,7 @@ "react-i18next": "^17.0.10", "react-native": "0.81.5", "react-native-gesture-handler": "~2.28.0", + "react-native-keyboard-controller": "^1.22.4", "react-native-marked": "8.0.0", "react-native-reanimated": "~4.1.1", "react-native-safe-area-context": "~5.6.0", @@ -8515,6 +8516,20 @@ "react-native": "*" } }, + "node_modules/react-native-keyboard-controller": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.22.4.tgz", + "integrity": "sha512-2by3oJBQqKH9UAydlBeiEpivxIyTbt345bmverLym7vbEp4NXckWQLF0STnVuXYccRak5/sd3wMYDJPhv/9+3g==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-reanimated": ">=3.0.0" + } + }, "node_modules/react-native-marked": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/react-native-marked/-/react-native-marked-8.0.0.tgz",