-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Migrate E/App to use PlatformStackNavigation
#49937
Changes from 77 commits
1408a2d
cf17480
2f4363c
2d2627a
a42c014
e476b1b
db5ec12
9d30239
df0b5b6
2eddd62
8f57acc
600088a
fb47d6f
de1eda9
a7293da
5fc7dd7
93d37cc
64ddf81
485fa25
1f98e64
1356eff
a9b8ef3
db5a9e3
711ae64
853349f
028b62a
2516570
88ff047
1250fc4
f6409c4
6a7b166
17a76e3
4b420a5
2409969
756fd60
8538b30
00a9c75
5485e44
a0404e6
eeac6c3
88cd73d
d29e08f
44c238d
3640bf2
e175aff
0106161
50abafc
6437a86
2210863
55d1eef
3e02e4d
c5004dc
8e78f30
3f60c7b
c88ff39
a98fcef
23e9953
df33cef
78d3bd5
f03f765
fab9a8b
1c574ac
f474be7
d0d8539
a851cd7
64a302d
863c2f7
61cd4cf
4cd3c5a
2281b02
106624a
a5924af
a60349c
f7f2557
1e36efe
c031e8f
3ee8c25
4832dfe
b94528e
fe01894
e19f126
b8a3ae0
05773fe
85c0dd7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
diff --git a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt | ||
index 9d08d39..146b9c2 100644 | ||
--- a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt | ||
+++ b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt | ||
@@ -18,6 +18,7 @@ import com.facebook.react.uimanager.PixelUtil | ||
import com.facebook.react.uimanager.UIManagerHelper | ||
import com.facebook.react.uimanager.UIManagerModule | ||
import com.swmansion.rnscreens.events.HeaderHeightChangeEvent | ||
+import com.swmansion.rnscreens.ext.isInsideScrollViewWithRemoveClippedSubviews | ||
|
||
@SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated. | ||
class Screen( | ||
@@ -310,6 +311,16 @@ class Screen( | ||
startTransitionRecursive(child.toolbar) | ||
} | ||
if (child is ViewGroup) { | ||
+ // a combination of https://github.com/software-mansion/react-native-screens/pull/2307/files and https://github.com/software-mansion/react-native-screens/pull/2383/files | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This patch can be removed if we switch to RNS 4.0 |
||
+ // The children are miscounted when there's a FlatList with | ||
+ // removeClippedSubviews set to true (default). | ||
+ // We add a simple view for each item in the list to make it work as expected. | ||
+ // See https://github.com/software-mansion/react-native-screens/issues/2282 | ||
+ if (child.isInsideScrollViewWithRemoveClippedSubviews()) { | ||
+ for (j in 0 until child.childCount) { | ||
+ child.addView(View(context)) | ||
+ } | ||
+ } | ||
startTransitionRecursive(child) | ||
} | ||
} | ||
diff --git a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt | ||
new file mode 100644 | ||
index 0000000..9d9fbfd | ||
--- /dev/null | ||
+++ b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt | ||
@@ -0,0 +1,21 @@ | ||
+package com.swmansion.rnscreens.ext | ||
+ | ||
+import android.view.View | ||
+import android.view.ViewGroup | ||
+import com.facebook.react.views.scroll.ReactHorizontalScrollView | ||
+import com.facebook.react.views.scroll.ReactScrollView | ||
+import com.swmansion.rnscreens.ScreenStack | ||
+ | ||
+internal fun View.isInsideScrollViewWithRemoveClippedSubviews(): Boolean { | ||
+ if (this is ReactHorizontalScrollView || this is ReactScrollView) { | ||
+ return false | ||
+ } | ||
+ var parentView = this.parent | ||
+ while (parentView is ViewGroup && parentView !is ScreenStack) { | ||
+ if (parentView is ReactScrollView) { | ||
+ return parentView.removeClippedSubviews | ||
+ } | ||
+ parentView = parentView.parent | ||
+ } | ||
+ return false | ||
+} | ||
\ No newline at end of file |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
diff --git a/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm b/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm | ||
index abb2cf6..fb81d52 100644 | ||
--- a/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm | ||
+++ b/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm | ||
@@ -5,13 +5,14 @@ | ||
|
||
// proportions to default transition duration | ||
static const float RNSSlideOpenTransitionDurationProportion = 1; | ||
-static const float RNSFadeOpenTransitionDurationProportion = 0.2 / 0.35; | ||
-static const float RNSSlideCloseTransitionDurationProportion = 0.25 / 0.35; | ||
-static const float RNSFadeCloseTransitionDurationProportion = 0.15 / 0.35; | ||
-static const float RNSFadeCloseDelayTransitionDurationProportion = 0.1 / 0.35; | ||
+static const float RNSFadeOpenTransitionDurationProportion = 0.2 / 0.5; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This patch can be removed if we switch to RNS 4.0
|
||
+static const float RNSSlideCloseTransitionDurationProportion = 0.25 / 0.5; | ||
+static const float RNSFadeCloseTransitionDurationProportion = 0.15 / 0.5; | ||
+static const float RNSFadeCloseDelayTransitionDurationProportion = 0.1 / 0.5; | ||
// same value is used in other projects using similar approach for transistions | ||
// and it looks the most similar to the value used by Apple | ||
static constexpr float RNSShadowViewMaxAlpha = 0.1; | ||
+static const int UIViewAnimationOptionCurveDefaultTransition = 7 << 16; | ||
|
||
@implementation RNSScreenStackAnimator { | ||
UINavigationControllerOperation _operation; | ||
@@ -22,7 +23,7 @@ - (instancetype)initWithOperation:(UINavigationControllerOperation)operation | ||
{ | ||
if (self = [super init]) { | ||
_operation = operation; | ||
- _transitionDuration = 0.35; // default duration in seconds | ||
+ _transitionDuration = 0.5; // default duration in seconds | ||
} | ||
return self; | ||
} | ||
@@ -129,6 +130,8 @@ - (void)animateSimplePushWithShadowEnabled:(BOOL)shadowEnabled | ||
} | ||
|
||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:^{ | ||
fromViewController.view.transform = leftTransform; | ||
toViewController.view.transform = CGAffineTransformIdentity; | ||
@@ -170,6 +173,8 @@ - (void)animateSimplePushWithShadowEnabled:(BOOL)shadowEnabled | ||
|
||
if (!transitionContext.isInteractive) { | ||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:animationBlock | ||
completion:completionBlock]; | ||
} else { | ||
@@ -203,6 +208,8 @@ - (void)animateSlideFromLeftWithTransitionContext:(id<UIViewControllerContextTra | ||
toViewController.view.transform = rightTransform; | ||
[[transitionContext containerView] addSubview:toViewController.view]; | ||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:^{ | ||
fromViewController.view.transform = leftTransform; | ||
toViewController.view.transform = CGAffineTransformIdentity; | ||
@@ -228,6 +235,8 @@ - (void)animateSlideFromLeftWithTransitionContext:(id<UIViewControllerContextTra | ||
|
||
if (!transitionContext.isInteractive) { | ||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:animationBlock | ||
completion:completionBlock]; | ||
} else { | ||
@@ -251,6 +260,8 @@ - (void)animateFadeWithTransitionContext:(id<UIViewControllerContextTransitionin | ||
[[transitionContext containerView] addSubview:toViewController.view]; | ||
toViewController.view.alpha = 0.0; | ||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:^{ | ||
toViewController.view.alpha = 1.0; | ||
} | ||
@@ -262,6 +273,8 @@ - (void)animateFadeWithTransitionContext:(id<UIViewControllerContextTransitionin | ||
[[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view]; | ||
|
||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:^{ | ||
fromViewController.view.alpha = 0.0; | ||
} | ||
@@ -284,6 +297,8 @@ - (void)animateSlideFromBottomWithTransitionContext:(id<UIViewControllerContextT | ||
toViewController.view.transform = topBottomTransform; | ||
[[transitionContext containerView] addSubview:toViewController.view]; | ||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:^{ | ||
fromViewController.view.transform = CGAffineTransformIdentity; | ||
toViewController.view.transform = CGAffineTransformIdentity; | ||
@@ -309,6 +324,8 @@ - (void)animateSlideFromBottomWithTransitionContext:(id<UIViewControllerContextT | ||
|
||
if (!transitionContext.isInteractive) { | ||
[UIView animateWithDuration:[self transitionDuration:transitionContext] | ||
+ delay:0 | ||
+ options:UIViewAnimationOptionCurveDefaultTransition | ||
animations:animationBlock | ||
completion:completionBlock]; | ||
} else { | ||
diff --git a/node_modules/react-native-screens/lib/typescript/fabric/ModalScreenNativeComponent.d.ts b/node_modules/react-native-screens/lib/typescript/fabric/ModalScreenNativeComponent.d.ts | ||
index 28d6463..a1473e1 100644 | ||
--- a/node_modules/react-native-screens/lib/typescript/fabric/ModalScreenNativeComponent.d.ts | ||
+++ b/node_modules/react-native-screens/lib/typescript/fabric/ModalScreenNativeComponent.d.ts | ||
@@ -55,7 +55,7 @@ export interface NativeProps extends ViewProps { | ||
gestureResponseDistance?: GestureResponseDistanceType; | ||
stackPresentation?: WithDefault<StackPresentation, 'push'>; | ||
stackAnimation?: WithDefault<StackAnimation, 'default'>; | ||
- transitionDuration?: WithDefault<Int32, 350>; | ||
+ transitionDuration?: WithDefault<Int32, 500>; | ||
replaceAnimation?: WithDefault<ReplaceAnimation, 'pop'>; | ||
swipeDirection?: WithDefault<SwipeDirection, 'horizontal'>; | ||
hideKeyboardOnSwipe?: boolean; | ||
diff --git a/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts b/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts | ||
index 11ed190..f676e08 100644 | ||
--- a/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts | ||
+++ b/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts | ||
@@ -55,7 +55,7 @@ export interface NativeProps extends ViewProps { | ||
gestureResponseDistance?: GestureResponseDistanceType; | ||
stackPresentation?: WithDefault<StackPresentation, 'push'>; | ||
stackAnimation?: WithDefault<StackAnimation, 'default'>; | ||
- transitionDuration?: WithDefault<Int32, 350>; | ||
+ transitionDuration?: WithDefault<Int32, 500>; | ||
replaceAnimation?: WithDefault<ReplaceAnimation, 'pop'>; | ||
swipeDirection?: WithDefault<SwipeDirection, 'horizontal'>; | ||
hideKeyboardOnSwipe?: boolean; | ||
diff --git a/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts b/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts | ||
index bb59c4c..d4c14ee 100644 | ||
--- a/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts | ||
+++ b/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts | ||
@@ -90,7 +90,7 @@ export interface NativeProps extends ViewProps { | ||
gestureResponseDistance?: GestureResponseDistanceType; | ||
stackPresentation?: WithDefault<StackPresentation, 'push'>; | ||
stackAnimation?: WithDefault<StackAnimation, 'default'>; | ||
- transitionDuration?: WithDefault<Int32, 350>; | ||
+ transitionDuration?: WithDefault<Int32, 500>; | ||
replaceAnimation?: WithDefault<ReplaceAnimation, 'pop'>; | ||
swipeDirection?: WithDefault<SwipeDirection, 'horizontal'>; | ||
hideKeyboardOnSwipe?: boolean; | ||
diff --git a/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts b/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts | ||
index 4e39336..ab0b313 100644 | ||
--- a/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts | ||
+++ b/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts | ||
@@ -92,7 +92,7 @@ export interface NativeProps extends ViewProps { | ||
gestureResponseDistance?: GestureResponseDistanceType; | ||
stackPresentation?: WithDefault<StackPresentation, 'push'>; | ||
stackAnimation?: WithDefault<StackAnimation, 'default'>; | ||
- transitionDuration?: WithDefault<Int32, 350>; | ||
+ transitionDuration?: WithDefault<Int32, 500>; | ||
replaceAnimation?: WithDefault<ReplaceAnimation, 'pop'>; | ||
swipeDirection?: WithDefault<SwipeDirection, 'horizontal'>; | ||
hideKeyboardOnSwipe?: boolean; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
diff --git a/node_modules/react-native-screens/ios/RNSScreenStack.mm b/node_modules/react-native-screens/ios/RNSScreenStack.mm | ||
index ea27b03..8f1d005 100644 | ||
--- a/node_modules/react-native-screens/ios/RNSScreenStack.mm | ||
+++ b/node_modules/react-native-screens/ios/RNSScreenStack.mm | ||
@@ -1121,16 +1121,7 @@ - (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childCompone | ||
- (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index | ||
{ | ||
RNSScreenView *screenChildComponent = (RNSScreenView *)childComponentView; | ||
- | ||
- // We should only do a snapshot of a screen that is on the top. | ||
- // We also check `_presentedModals` since if you push 2 modals, second one is not a "child" of _controller. | ||
- // Also, when dissmised with a gesture, the screen already is not under the window, so we don't need to apply | ||
- // snapshot. | ||
- if (screenChildComponent.window != nil && | ||
- ((screenChildComponent == _controller.visibleViewController.view && _presentedModals.count < 2) || | ||
- screenChildComponent == [_presentedModals.lastObject view])) { | ||
- [screenChildComponent.controller setViewToSnapshot]; | ||
- } | ||
+ [screenChildComponent.controller setViewToSnapshot]; | ||
|
||
RCTAssert( | ||
screenChildComponent.reactSuperview == self, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
commenting so this shows on my k2 for easy access