From 0b564910887d83c8045db32f1389f59f1190583c Mon Sep 17 00:00:00 2001 From: Konrad Michalik Date: Fri, 3 Jul 2026 14:59:55 +0200 Subject: [PATCH 1/4] feat(Stack v5, iOS): Add `keepsMenuPresented` prop to menuItems --- .../test-stack-header-menu-ios/index.tsx | 14 ++++++-- .../header/RNSStackHeaderMenuCoordinator.mm | 35 +++++++++++++++---- .../stack/header/RNSStackHeaderMenuData.h | 4 ++- .../stack/header/RNSStackHeaderMenuData.mm | 2 ++ .../stack/header/RNSStackHeaderMenuMapper.mm | 6 ++-- .../header/ios/StackHeaderMenu.ios.types.ts | 15 ++++++++ .../StackHeaderItemIOSNativeComponent.ts | 1 + 7 files changed, 66 insertions(+), 11 deletions(-) diff --git a/apps/src/tests/single-feature-tests/stack-v5/test-stack-header-menu-ios/index.tsx b/apps/src/tests/single-feature-tests/stack-v5/test-stack-header-menu-ios/index.tsx index 3ecc4dc07b..45260989ee 100644 --- a/apps/src/tests/single-feature-tests/stack-v5/test-stack-header-menu-ios/index.tsx +++ b/apps/src/tests/single-feature-tests/stack-v5/test-stack-header-menu-ios/index.tsx @@ -33,6 +33,7 @@ function TestStackHeaderMenuIOS() { function buildHeaderConfig( trailingItemsCount: number, showToast: (text: string) => void, + keepsMenuPresented: boolean, ): StackHeaderConfigProps { const trailingItems: NonNullable< StackHeaderConfigProps['ios'] @@ -58,6 +59,7 @@ function buildHeaderConfig( type: 'menuItem', itemType: 'action', title: `Action ${i}-1`, + keepsMenuPresented, onPress: () => showToast(`Clicked Action ${i}-1`), }, { @@ -65,18 +67,21 @@ function buildHeaderConfig( type: 'menuItem', itemType: 'toggle', title: `Toggle ${i}-1`, + keepsMenuPresented, }, { id: `toggle-${i}-2`, type: 'menuItem', itemType: 'toggle', title: `Toggle ${i}-2`, + keepsMenuPresented, }, { id: `toggle-${i}-3`, type: 'menuItem', itemType: 'toggle', title: `Toggle ${i}-3`, + keepsMenuPresented, }, { id: `submenu-${i}`, @@ -130,6 +135,7 @@ function ConfigScreen() { const [trailingItemsCount, setTrailingItemsCount] = useState( DEFAULT_TRAILING_ITEMS_COUNT, ); + const [keepsMenuPresented, setKeepsMenuPresented] = useState(false); const showToast = useCallback( (text: string) => { @@ -140,8 +146,8 @@ function ConfigScreen() { const { setRouteOptions, routeKey } = navigation; const headerConfig = useMemo( - () => buildHeaderConfig(trailingItemsCount, showToast), - [trailingItemsCount, showToast], + () => buildHeaderConfig(trailingItemsCount, showToast, keepsMenuPresented), + [trailingItemsCount, showToast, keepsMenuPresented], ); useLayoutEffect(() => { @@ -156,6 +162,10 @@ function ConfigScreen() { title={`Toggle trailing items count (${trailingItemsCount}/4)`} onPress={() => setTrailingItemsCount(count => (count + 1) % 5)} /> +