Skip to content
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

Open
wants to merge 39 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
1408a2d
feat: native-stack (initial changes)
kirillzyusko Oct 11, 2024
cf17480
fix: match previous behavior and close keyboard in chat navigator whe…
kirillzyusko Oct 11, 2024
2f4363c
fix: prettier
kirillzyusko Oct 11, 2024
2d2627a
fix: partially fix CI checks
kirillzyusko Oct 11, 2024
a42c014
fix: eslint
kirillzyusko Oct 11, 2024
e476b1b
fix: removed unused code
kirillzyusko Oct 11, 2024
db5ec12
fix: TS
kirillzyusko Oct 11, 2024
9d30239
fix: rename functions to pass CI
kirillzyusko Oct 11, 2024
df0b5b6
fix: crashes in FlatList on goBack on Android
kirillzyusko Oct 14, 2024
2eddd62
fix: crash when open and close image in chat
kirillzyusko Oct 14, 2024
8f57acc
fix: incorrect merge conflic resolve
kirillzyusko Oct 14, 2024
600088a
fix: not showing up keyboard in ChatFinder screen
kirillzyusko Oct 15, 2024
fb47d6f
fix: iOS un-natural transitions
kirillzyusko Oct 16, 2024
de1eda9
fix: new screen to use new interface
kirillzyusko Oct 16, 2024
a7293da
fix: remove header in FullScreenNavigator
chrispader Oct 6, 2024
5fc7dd7
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 21, 2024
93d37cc
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 22, 2024
64ddf81
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 23, 2024
485fa25
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 24, 2024
1f98e64
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 24, 2024
1356eff
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 24, 2024
a9b8ef3
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 25, 2024
db5a9e3
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 26, 2024
711ae64
remove unused temporary navigator factories
chrispader Oct 26, 2024
853349f
fix: improve naming of (side) modal navigator screen options generators
chrispader Oct 28, 2024
028b62a
fix: further improve naming
chrispader Oct 28, 2024
2516570
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 28, 2024
88ff047
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 30, 2024
1250fc4
fix: background flashing inverse color
chrispader Oct 30, 2024
f6409c4
fix: use correct Navigation theme based on theme
chrispader Oct 30, 2024
6a7b166
remove unused onSubmit prop
chrispader Oct 30, 2024
17a76e3
fix: remove onSubmit prop type
chrispader Oct 30, 2024
4b420a5
fix: modal stack background style
chrispader Oct 30, 2024
2409969
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Oct 30, 2024
756fd60
fix: use `shouldUseNarrowLayout` instead of `isSmallScreenWidth`
chrispader Oct 30, 2024
8538b30
fix: typo
chrispader Oct 31, 2024
00a9c75
fix: unused onSubmit
chrispader Oct 31, 2024
5485e44
add empty line at the end
chrispader Nov 1, 2024
a0404e6
Merge branch 'main' into @chrispader/use-platform-stack-navigation-in…
chrispader Nov 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,4 @@ target 'NotificationServiceExtension' do
pod 'AppLogs', :path => '../node_modules/react-native-app-logs/AppLogsPod'
end

pod 'FullStory', :http => 'https://ios-releases.fullstory.com/fullstory-1.52.0-xcframework.tar.gz'
pod 'FullStory', :http => 'https://ios-releases.fullstory.com/fullstory-1.52.0-xcframework.tar.gz'
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
diff --git a/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/PagerViewViewManagerImpl.kt b/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/PagerViewViewManagerImpl.kt
index 0abf668..0bfca0a 100644
--- a/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/PagerViewViewManagerImpl.kt
+++ b/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/PagerViewViewManagerImpl.kt
@@ -151,10 +151,20 @@ object PagerViewViewManagerImpl {

private fun refreshViewChildrenLayout(view: View) {
view.post {
- view.measure(
+ try {
+ view.measure(
View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.EXACTLY),
- View.MeasureSpec.makeMeasureSpec(view.height, View.MeasureSpec.EXACTLY))
- view.layout(view.left, view.top, view.right, view.bottom)
+ View.MeasureSpec.makeMeasureSpec(view.height, View.MeasureSpec.EXACTLY)
+ )
+ view.layout(view.left, view.top, view.right, view.bottom)
+ } catch (e: Exception) {
+ // no-op
+ // fixes a crash: java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
+ // It looks like we can not force layout on a recycled views. The safer solution would be simply call .requestLayout(), but I believe that
+ // force layouting was added intentionally and fixes some issues, so we simply wrap the operation with try/catch to not crash the app
+ // patch can be removed when https://github.com/callstack/react-native-pager-view/issues/882 or https://github.com/callstack/react-native-pager-view/issues/859
+ // will be fixed
+ }
}
}
}
\ No newline at end of file
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
+ // 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;
+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;
1 change: 0 additions & 1 deletion src/components/AttachmentModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,6 @@ function AttachmentModal({
<>
<Modal
type={modalType}
onSubmit={submitAndClose}
onClose={isOverlayModalVisible ? closeConfirmModal : closeModal}
isVisible={isModalOpen}
onModalShow={() => {
Expand Down
1 change: 0 additions & 1 deletion src/components/ConfirmModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ function ConfirmModal({

return (
<Modal
onSubmit={onConfirm}
onClose={onCancel}
onBackdropPress={onBackdropPress}
isVisible={isVisible}
Expand Down
3 changes: 0 additions & 3 deletions src/components/Modal/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ type BaseModalProps = Partial<ModalProps> & {
/** State that determines whether to display the modal or not */
isVisible: boolean;

/** Callback method fired when the user requests to submit the modal content. */
onSubmit?: () => void;

/** Callback method fired when the modal is hidden */
onModalHide?: () => void;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type {RouteProp} from '@react-navigation/native';
import {useRoute} from '@react-navigation/native';
import lodashSortBy from 'lodash/sortBy';
import truncate from 'lodash/truncate';
Expand Down Expand Up @@ -29,6 +28,7 @@ import * as CurrencyUtils from '@libs/CurrencyUtils';
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
import * as IOUUtils from '@libs/IOUUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types';
import * as OptionsListUtils from '@libs/OptionsListUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
Expand Down Expand Up @@ -71,7 +71,7 @@ function MoneyRequestPreviewContent({
const StyleUtils = useStyleUtils();
const {translate} = useLocalize();
const {windowWidth} = useWindowDimensions();
const route = useRoute<RouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
const route = useRoute<PlatformStackRouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
const {shouldUseNarrowLayout} = useResponsiveLayout();
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || '-1'}`);
Expand Down
6 changes: 3 additions & 3 deletions src/components/ScreenWrapper.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import {useIsFocused, useNavigation} from '@react-navigation/native';
import type {StackNavigationProp} from '@react-navigation/stack';
import type {ForwardedRef, ReactNode} from 'react';
import React, {createContext, forwardRef, useEffect, useMemo, useRef, useState} from 'react';
import type {StyleProp, ViewStyle} from 'react-native';
Expand All @@ -15,6 +14,7 @@ import useTackInputFocus from '@hooks/useTackInputFocus';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import * as Browser from '@libs/Browser';
import type {PlatformStackNavigationProp} from '@libs/Navigation/PlatformStackNavigation/types';
import type {AuthScreensParamList, RootStackParamList} from '@libs/Navigation/types';
import toggleTestToolsModal from '@userActions/TestTool';
import CONST from '@src/CONST';
Expand Down Expand Up @@ -96,7 +96,7 @@ type ScreenWrapperProps = {
*
* This is required because transitionEnd event doesn't trigger in the testing environment.
*/
navigation?: StackNavigationProp<RootStackParamList> | StackNavigationProp<AuthScreensParamList>;
navigation?: PlatformStackNavigationProp<RootStackParamList> | PlatformStackNavigationProp<AuthScreensParamList>;

/** Whether to show offline indicator on wide screens */
shouldShowOfflineIndicatorInWideScreen?: boolean;
Expand Down Expand Up @@ -141,7 +141,7 @@ function ScreenWrapper(
* so in other places where ScreenWrapper is used, we need to
* fallback to useNavigation.
*/
const navigationFallback = useNavigation<StackNavigationProp<RootStackParamList>>();
const navigationFallback = useNavigation<PlatformStackNavigationProp<RootStackParamList>>();
const navigation = navigationProp ?? navigationFallback;
const isFocused = useIsFocused();
const {windowHeight} = useWindowDimensions(shouldUseCachedViewportHeight);
Expand Down
Loading
Loading