diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt index 3533ea493c..080b79819e 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt @@ -4,6 +4,7 @@ import android.util.Log import android.view.View import com.facebook.react.bridge.JSApplicationCausedNativeException import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReadableArray import com.facebook.react.module.annotations.ReactModule import com.facebook.react.uimanager.LayoutShadowNode import com.facebook.react.uimanager.ReactStylesDiffMap @@ -318,4 +319,18 @@ class ScreenStackHeaderConfigViewManager : ) { logNotAvailable("blurEffect") } + + override fun setHeaderLeftBarButtonItems( + view: ScreenStackHeaderConfig?, + value: ReadableArray?, + ) { + logNotAvailable("headerLeftBarButtonItems") + } + + override fun setHeaderRightBarButtonItems( + view: ScreenStackHeaderConfig?, + value: ReadableArray?, + ) { + logNotAvailable("headerRightBarButtonItems") + } } diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt index b48a9762bb..73be25fc85 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt @@ -1,5 +1,6 @@ package com.swmansion.rnscreens +import android.util.Log import com.facebook.react.bridge.JSApplicationIllegalArgumentException import com.facebook.react.module.annotations.ReactModule import com.facebook.react.uimanager.ReactStylesDiffMap @@ -41,6 +42,14 @@ class ScreenStackHeaderSubviewManager : } } + @ReactProp(name = "hidesSharedBackground") + override fun setHidesSharedBackground( + view: ScreenStackHeaderSubview, + hidesSharedBackground: Boolean, + ) { + Log.w("[RNScreens]", "hidesSharedBackground prop is not available on Android") + } + override fun updateState( view: ScreenStackHeaderSubview, props: ReactStylesDiffMap?, diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java index d59f9b4bb4..3ef1e7a08d 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java @@ -12,6 +12,7 @@ import android.view.View; import androidx.annotation.Nullable; import com.facebook.react.bridge.ColorPropConverter; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.uimanager.BaseViewManager; import com.facebook.react.uimanager.BaseViewManagerDelegate; import com.facebook.react.uimanager.LayoutShadowNode; @@ -108,6 +109,12 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "topInsetEnabled": mViewManager.setTopInsetEnabled(view, value == null ? false : (boolean) value); break; + case "headerLeftBarButtonItems": + mViewManager.setHeaderLeftBarButtonItems(view, (ReadableArray) value); + break; + case "headerRightBarButtonItems": + mViewManager.setHeaderRightBarButtonItems(view, (ReadableArray) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java index 446043698a..0f1bc58396 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java @@ -11,6 +11,7 @@ import android.view.View; import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableArray; public interface RNSScreenStackHeaderConfigManagerInterface { @@ -42,4 +43,6 @@ public interface RNSScreenStackHeaderConfigManagerInterface { void setBackButtonInCustomView(T view, boolean value); void setBlurEffect(T view, @Nullable String value); void setTopInsetEnabled(T view, boolean value); + void setHeaderLeftBarButtonItems(T view, @Nullable ReadableArray value); + void setHeaderRightBarButtonItems(T view, @Nullable ReadableArray value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java index 439ead9b8d..5da63c7dcb 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java @@ -26,6 +26,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "type": mViewManager.setType(view, (String) value); break; + case "hidesSharedBackground": + mViewManager.setHidesSharedBackground(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java index dc320ad032..49bf9cadb6 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java @@ -15,4 +15,5 @@ public interface RNSScreenStackHeaderSubviewManagerInterface { void setType(T view, @Nullable String value); + void setHidesSharedBackground(T view, boolean value); } diff --git a/apps/Example.tsx b/apps/Example.tsx index 0fd66e7cc6..8ba25dbf2a 100644 --- a/apps/Example.tsx +++ b/apps/Example.tsx @@ -30,6 +30,7 @@ import Orientation from './src/screens/Orientation'; import SearchBar from './src/screens/SearchBar'; import Events from './src/screens/Events'; import Gestures from './src/screens/Gestures'; +import BarButtonItems from './src/screens/BarButtonItems'; import { GestureDetectorProvider } from 'react-native-screens/gesture-handler'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; @@ -127,6 +128,11 @@ const SCREENS: Record< component: Gestures, type: 'playground', }, + BarButtonItems: { + title: 'Bar Button Items', + component: BarButtonItems, + type: 'playground', + }, }; if (isTestSectionEnabled()) { diff --git a/apps/src/screens/BarButtonItems.tsx b/apps/src/screens/BarButtonItems.tsx new file mode 100644 index 0000000000..d3288a04ab --- /dev/null +++ b/apps/src/screens/BarButtonItems.tsx @@ -0,0 +1,488 @@ +// NOTE: The full native feature set (style, image, menu, etc.) is available, but the TS types in src/types.tsx need to be updated to match. This example uses only the currently typed props (title, icon, onPress, enabled). +import React from 'react'; +import { View, Alert, Button, Text, Platform, TouchableOpacity } from 'react-native'; +import { createNativeStackNavigator } from '@react-navigation/native-stack'; +import { ScrollView } from 'react-native-gesture-handler'; + +const Stack = createNativeStackNavigator(); + +const demoScreens = [ + { name: 'PlainButtonDemo', title: 'Plain Button' }, + { name: 'IconButtonDemo', title: 'Icon Button' }, + { name: 'SystemIconButtonDemo', title: 'System Icon Button' }, + { name: 'MenuButtonDemo', title: 'Menu Button' }, + { name: 'BadgeButtonDemo', title: 'Badge Button' }, + { name: 'DisabledButtonDemo', title: 'Disabled Button' }, + { name: 'CustomColorButtonDemo', title: 'Custom Color Button' }, + { name: 'ProminentStyleButtonDemo', title: 'Prominent Style Button' }, + { name: 'LabelStyleButtonDemo', title: 'Label Style Button' }, + { name: 'IconSharesBgButtonDemo', title: 'Icon SharesBackground' }, + { name: 'TextButtonWithWidthDemo', title: 'Text Button With Width' }, + { name: 'IconButtonsWithSpacingDemo', title: 'Icon Buttons With Spacing' }, + { name: 'HeaderTintColorDemo', title: 'Header Tint Color' }, + { name: 'DoneStyleButtonDemo', title: 'Done Style Button' }, + { name: 'AdvancedMenuButtonDemo', title: 'Advanced Menu Button' }, + { name: 'ReactNodeButtonDemo', title: 'React Node Button' }, + { name: "BackButtonVisibleDemo", title: "Back Button Visible" }, + { name: "IdentifierExample", title: "Identifier Example" }, + { name: "IdentifierExample2", title: "Identifier Example 2" }, + { name: "ExessiveItemsExample", title: "Exessive Items Example" }, +]; + +const MainScreen = ({ navigation }: any) => ( + + + iOS only + + {demoScreens.map((screen) => ( +