diff --git a/Example/ios/ScreensExample/Images.xcassets/logo.imageset/Contents.json b/Example/ios/ScreensExample/Images.xcassets/logo.imageset/Contents.json
new file mode 100644
index 0000000000..b71a158885
--- /dev/null
+++ b/Example/ios/ScreensExample/Images.xcassets/logo.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "react-logo.svg",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "preserves-vector-representation" : true
+ }
+}
diff --git a/Example/ios/ScreensExample/Images.xcassets/logo.imageset/react-logo.svg b/Example/ios/ScreensExample/Images.xcassets/logo.imageset/react-logo.svg
new file mode 100644
index 0000000000..e051eb3653
--- /dev/null
+++ b/Example/ios/ScreensExample/Images.xcassets/logo.imageset/react-logo.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt
index 7854606c22..d93a0c992c 100644
--- a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt
+++ b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt
@@ -84,6 +84,11 @@ class TabScreenViewManager :
value: String?,
) = Unit
+ override fun setIconXcassetsName(
+ view: TabScreen?,
+ value: String?,
+ ) = Unit
+
override fun setSelectedIconImageSource(
view: TabScreen?,
value: ReadableMap?,
@@ -94,6 +99,11 @@ class TabScreenViewManager :
value: String?,
) = Unit
+ override fun setSelectedIconXcassetsName(
+ view: TabScreen?,
+ value: String?,
+ ) = Unit
+
// Annotation is Paper only
@ReactProp(name = "isFocused")
override fun setIsFocused(
diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java
index 5f8b030f34..d1245606fa 100644
--- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java
+++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java
@@ -19,10 +19,12 @@
import com.facebook.react.uimanager.LayoutShadowNode;
@SuppressWarnings("deprecation")
-public class RNSBottomTabsScreenManagerDelegate & RNSBottomTabsScreenManagerInterface> extends BaseViewManagerDelegate {
+public class RNSBottomTabsScreenManagerDelegate & RNSBottomTabsScreenManagerInterface>
+ extends BaseViewManagerDelegate {
public RNSBottomTabsScreenManagerDelegate(U viewManager) {
super(viewManager);
}
+
@Override
public void setProperty(T view, String propName, @Nullable Object value) {
switch (propName) {
@@ -71,12 +73,18 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "iconSfSymbolName":
mViewManager.setIconSfSymbolName(view, value == null ? null : (String) value);
break;
+ case "iconXcassetsName":
+ mViewManager.setIconXcassetsName(view, value == null ? null : (String) value);
+ break;
case "selectedIconImageSource":
mViewManager.setSelectedIconImageSource(view, (ReadableMap) value);
break;
case "selectedIconSfSymbolName":
mViewManager.setSelectedIconSfSymbolName(view, value == null ? null : (String) value);
break;
+ case "selectedIconXcassetsName":
+ mViewManager.setSelectedIconXcassetsName(view, value == null ? null : (String) value);
+ break;
case "systemItem":
mViewManager.setSystemItem(view, (String) value);
break;
diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java
index 1078f012d7..cc28adb997 100644
--- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java
+++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java
@@ -31,8 +31,10 @@ public interface RNSBottomTabsScreenManagerInterface extends Vie
void setIconType(T view, @Nullable String value);
void setIconImageSource(T view, @Nullable ReadableMap value);
void setIconSfSymbolName(T view, @Nullable String value);
+ void setIconXcassetsName(T view, @Nullable String value);
void setSelectedIconImageSource(T view, @Nullable ReadableMap value);
void setSelectedIconSfSymbolName(T view, @Nullable String value);
+ void setSelectedIconXcassetsName(T view, @Nullable String value);
void setSystemItem(T view, @Nullable String value);
void setSpecialEffects(T view, @Nullable ReadableMap value);
void setOverrideScrollViewContentInsetAdjustmentBehavior(T view, boolean value);
diff --git a/apps/src/screens/BarButtonItems.tsx b/apps/src/screens/BarButtonItems.tsx
index d1b518d2ab..cf6106a821 100644
--- a/apps/src/screens/BarButtonItems.tsx
+++ b/apps/src/screens/BarButtonItems.tsx
@@ -16,6 +16,7 @@ const Stack = createNativeStackNavigator();
const demoScreens = [
{ name: 'PlainButtonDemo', title: 'Plain Button' },
{ name: 'IconButtonDemo', title: 'Icon Button' },
+ { name: 'XcassetsIconButtonDemo', title: 'Xcassets Icon Button' },
{ name: 'SystemIconButtonDemo', title: 'System Icon Button' },
{ name: 'MenuButtonDemo', title: 'Menu Button' },
{ name: 'BadgeButtonDemo', title: 'Badge Button' },
@@ -63,6 +64,7 @@ const DemoScreenContent = () => (
const PlainButtonDemo = DemoScreenContent;
const IconButtonDemo = DemoScreenContent;
+const XcassetsIconButtonDemo = DemoScreenContent;
const MenuButtonDemo = DemoScreenContent;
const BadgeButtonDemo = DemoScreenContent;
const DisabledButtonDemo = DemoScreenContent;
@@ -128,6 +130,24 @@ export default function BarButtonItemsExample() {
],
}}
/>
+ [
+ {
+ type: "button",
+ icon: {
+ type: "xcassets",
+ name: "logo",
+ },
+ label: "Xcassets",
+ onPress: () => Alert.alert('Icon Xcassets pressed'),
+ }
+ ],
+ }}
+ />
+
+
+ );
+}
+
+export function BottomTabsScenario() {
+ const [config, setConfig] = useState({ ...SCROLL_EDGE_EFFECT_DEFAULTS });
+
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/src/tests/Test3443/Config.tsx b/apps/src/tests/Test3443/Config.tsx
new file mode 100644
index 0000000000..a46170e85c
--- /dev/null
+++ b/apps/src/tests/Test3443/Config.tsx
@@ -0,0 +1,71 @@
+import React, { Button, Text } from "react-native";
+import { useScrollEdgeEffectsConfigContext } from './context';
+import { NavigationProp, useNavigation } from "@react-navigation/core";
+import { SettingsPicker } from "../../shared";
+import { ScrollEdgeEffect } from "react-native-screens";
+
+interface ConfigProps {
+ title: string;
+ navigation?: NavigationProp<{ Test: undefined }>;
+}
+
+const SCROLL_EDGE_EFFECT_OPTIONS: ScrollEdgeEffect[] = ['automatic', 'hard', 'soft', 'hidden'];
+
+function ConfigWithOptionalNavigation(props: ConfigProps) {
+ const { title, navigation } = props;
+
+ const { config, setConfig } = useScrollEdgeEffectsConfigContext();
+
+ return (
+ <>
+ {title}
+
+ setConfig({...config, bottom: value})
+ }
+ />
+
+ setConfig({...config, top: value})
+ }
+ />
+
+ setConfig({...config, left: value})
+ }
+ />
+
+ setConfig({...config, right: value})
+ }
+ />
+ { navigation &&