From 107f6024ea4786a58a83c921728a113b849de192 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Tue, 13 Oct 2026 21:18:29 -0700 Subject: [PATCH] fix(mobile): search bar animates in on iOS 26+ instead of popping (#19209) --- .../workspace/WorkspaceToolbar.ios.tsx | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx b/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx index 1a441df9ea0a2cdd552bc000d2e7c45aeb0d80f1..de33580eae5999a8ac5bb7a6ca65275d304abdac 100644 --- a/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx +++ b/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx @@ -4,6 +4,7 @@ import { Platform } from "react-native"; import { useNativeLayoutMetrics } from "../../native/native-layout-metrics"; import type { SearchBarCommands } from "react-native-screens"; +import { NATIVE_LIQUID_GLASS_SUPPORTED } from "../../native/native-glass"; import { NativeHeaderToolbar, NativeStackScreenOptions } from "../../native/StackHeader"; import { NativeWorkspaceTabActivityContext } from "../../native/v5-workspace-context"; import { useHardwareKeyboardCommand } from "../keyboard/hardwareKeyboardCommands"; @@ -26,8 +27,7 @@ export function WorkspaceToolbar(props: { const searchRef = useRef(null); const tab = workspace.state.tabs[workspace.state.selectedTab]; const selectedTab = workspace.state.selectedTab; - const focusSearch = useCallback(() => { - if (!workspace.isTabActive(selectedTab)) return false; + const enterSearch = useCallback(() => { workspace.dispatch({ type: "scroll", tab: selectedTab, @@ -35,9 +35,14 @@ export function WorkspaceToolbar(props: { }); workspace.dispatch({ type: "search", tab: selectedTab }); if (props.sidebar && !panes.primarySidebarVisible) togglePrimarySidebar(); + }, [workspace, selectedTab, props.sidebar, panes.primarySidebarVisible, togglePrimarySidebar]); + const focusSearch = useCallback(() => { + if (!workspace.isTabActive(selectedTab)) return false; + // A mounted bar enters search from its own onFocus. + if (!NATIVE_LIQUID_GLASS_SUPPORTED) enterSearch(); searchRef.current?.focus(); return true; - }, [workspace, selectedTab, props.sidebar, panes.primarySidebarVisible, togglePrimarySidebar]); + }, [workspace, selectedTab, enterSearch]); useHardwareKeyboardCommand("focusSearch", focusSearch); const restoreSearch = useCallback(() => { if (isTabActive(selectedTab) && tab.searchMode !== "resting") @@ -59,8 +64,10 @@ export function WorkspaceToolbar(props: { workspace.dispatch({ type: "search", tab: selectedTab }), + onFocus: () => + tab.searchMode === "resting" + ? enterSearch() + : workspace.dispatch({ type: "search", tab: selectedTab }), onBlur: () => workspace.dispatch({ type: "expand", tab: selectedTab }), onSearchButtonPress: () => searchRef.current?.blur(), onChangeText: ({ nativeEvent }) => @@ -102,13 +112,15 @@ export function WorkspaceToolbar(props: { }) } /> - + {NATIVE_LIQUID_GLASS_SUPPORTED ? null : ( + + )} {nativeToolbarCompose ? : null} -- 2.54.0