diff --git a/packages/app/src/composer/draft/workspace-tab.tsx b/packages/app/src/composer/draft/workspace-tab.tsx index f610249a1..3c4ab0b9d 100644 --- a/packages/app/src/composer/draft/workspace-tab.tsx +++ b/packages/app/src/composer/draft/workspace-tab.tsx @@ -1,7 +1,9 @@ import { useCallback, useEffect, useMemo, useRef } from "react"; import { Keyboard, ScrollView, Text, View } from "react-native"; +import ReanimatedAnimated from "react-native-reanimated"; import { StyleSheet } from "react-native-unistyles"; import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { useKeyboardShiftStyle } from "@/hooks/use-keyboard-shift-style"; import invariant from "tiny-invariant"; import { Composer } from "@/composer"; import { DraftAgentModeControl } from "@/composer/agent-controls/mode-control"; @@ -584,9 +586,13 @@ export function WorkspaceDraftAgentTab({ [composerState], ); + const { style: composerKeyboardStyle } = useKeyboardShiftStyle({ + mode: "translate", + }); + const inputAreaWrapperStyle = useMemo( - () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }], - [insets.bottom], + () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }, composerKeyboardStyle], + [insets.bottom, composerKeyboardStyle], ); const handleDropdownCloseFocus = useCallback(() => { @@ -656,7 +662,7 @@ export function WorkspaceDraftAgentTab({ )} - + {importPillPress ? ( @@ -667,6 +673,7 @@ export function WorkspaceDraftAgentTab({ - + ); diff --git a/packages/app/src/composer/index.tsx b/packages/app/src/composer/index.tsx index c5c10921a..2d10d7f70 100644 --- a/packages/app/src/composer/index.tsx +++ b/packages/app/src/composer/index.tsx @@ -665,6 +665,8 @@ interface ComposerProps { inputWrapperStyle?: import("react-native").ViewStyle; /** Rendered below the input, inside the keyboard-shifted container. */ footer?: ReactNode; + /** When true, a parent wrapper owns the keyboard shift, so the composer skips its own. */ + externalKeyboardShift?: boolean; } const EMPTY_ARRAY: readonly QueuedMessage[] = []; @@ -859,6 +861,7 @@ export function Composer({ agentControls, inputWrapperStyle, footer, + externalKeyboardShift, }: ComposerProps) { const buttonIconSize = resolveComposerButtonIconSize(); const client = useHostRuntimeClient(serverId); @@ -1307,6 +1310,7 @@ export function Composer({ const { style: keyboardAnimatedStyle } = useKeyboardShiftStyle({ mode: "translate", + enabled: !externalKeyboardShift, }); const isVoiceModeForAgent = resolveIsVoiceModeForAgent(voice, serverId, agentId); diff --git a/packages/app/src/panels/agent-panel.tsx b/packages/app/src/panels/agent-panel.tsx index 9f4dd1b08..f308f5de5 100644 --- a/packages/app/src/panels/agent-panel.tsx +++ b/packages/app/src/panels/agent-panel.tsx @@ -1392,9 +1392,13 @@ function ActiveAgentComposer({ ], ); + const { style: composerKeyboardStyle } = useKeyboardShiftStyle({ + mode: "translate", + }); + const inputAreaStyle = useMemo( - () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }], - [insets.bottom], + () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }, composerKeyboardStyle], + [insets.bottom, composerKeyboardStyle], ); const composerFooter = useMemo( @@ -1406,7 +1410,7 @@ function ActiveAgentComposer({ ); return ( - + - + ); }