react-native-screens 4.0.0-beta.15 → 4.0.0-beta.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/ios/RNSConvert.mm +1 -1
  2. package/ios/RNSScreenStack.mm +16 -3
  3. package/lib/commonjs/components/DebugContainer.js.map +1 -1
  4. package/lib/commonjs/components/DebugContainer.web.js.map +1 -1
  5. package/lib/commonjs/components/Screen.js.map +1 -1
  6. package/lib/commonjs/components/ScreenStack.js +40 -7
  7. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  8. package/lib/commonjs/components/ScreenStackItem.js +35 -2
  9. package/lib/commonjs/components/ScreenStackItem.js.map +1 -1
  10. package/lib/commonjs/contexts.js +11 -0
  11. package/lib/commonjs/contexts.js.map +1 -0
  12. package/lib/commonjs/gesture-handler/GestureDetectorProvider.js +2 -2
  13. package/lib/commonjs/gesture-handler/GestureDetectorProvider.js.map +1 -1
  14. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js +3 -3
  15. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js.map +1 -1
  16. package/lib/commonjs/gesture-handler/fabricUtils.js +54 -18
  17. package/lib/commonjs/gesture-handler/fabricUtils.js.map +1 -1
  18. package/lib/commonjs/index.js +1 -8
  19. package/lib/commonjs/index.js.map +1 -1
  20. package/lib/commonjs/native-stack/views/NativeStackView.js +24 -32
  21. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  22. package/lib/module/components/DebugContainer.js.map +1 -1
  23. package/lib/module/components/DebugContainer.web.js.map +1 -1
  24. package/lib/module/components/Screen.js.map +1 -1
  25. package/lib/module/components/ScreenStack.js +40 -7
  26. package/lib/module/components/ScreenStack.js.map +1 -1
  27. package/lib/module/components/ScreenStackItem.js +35 -2
  28. package/lib/module/components/ScreenStackItem.js.map +1 -1
  29. package/lib/module/contexts.js +4 -0
  30. package/lib/module/contexts.js.map +1 -0
  31. package/lib/module/gesture-handler/GestureDetectorProvider.js +1 -1
  32. package/lib/module/gesture-handler/GestureDetectorProvider.js.map +1 -1
  33. package/lib/module/gesture-handler/ScreenGestureDetector.js +3 -3
  34. package/lib/module/gesture-handler/ScreenGestureDetector.js.map +1 -1
  35. package/lib/module/gesture-handler/fabricUtils.js +55 -17
  36. package/lib/module/gesture-handler/fabricUtils.js.map +1 -1
  37. package/lib/module/index.js +3 -5
  38. package/lib/module/index.js.map +1 -1
  39. package/lib/module/native-stack/views/NativeStackView.js +24 -32
  40. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  41. package/lib/typescript/components/DebugContainer.d.ts.map +1 -1
  42. package/lib/typescript/components/Screen.d.ts.map +1 -1
  43. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  44. package/lib/typescript/components/ScreenStackItem.d.ts +1 -0
  45. package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -1
  46. package/lib/typescript/contexts.d.ts +5 -0
  47. package/lib/typescript/contexts.d.ts.map +1 -0
  48. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts +2 -2
  49. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts.map +1 -1
  50. package/lib/typescript/gesture-handler/fabricUtils.d.ts +7 -5
  51. package/lib/typescript/gesture-handler/fabricUtils.d.ts.map +1 -1
  52. package/lib/typescript/index.d.ts +1 -4
  53. package/lib/typescript/index.d.ts.map +1 -1
  54. package/lib/typescript/native-stack/types.d.ts +6 -8
  55. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  56. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  57. package/lib/typescript/types.d.ts +46 -10
  58. package/lib/typescript/types.d.ts.map +1 -1
  59. package/package.json +1 -1
  60. package/react-native.config.js +16 -28
  61. package/src/components/DebugContainer.tsx +2 -2
  62. package/src/components/DebugContainer.web.tsx +1 -1
  63. package/src/components/Screen.tsx +4 -7
  64. package/src/components/ScreenStack.tsx +95 -19
  65. package/src/components/ScreenStackItem.tsx +56 -16
  66. package/src/contexts.tsx +9 -0
  67. package/src/gesture-handler/GestureDetectorProvider.tsx +2 -2
  68. package/src/gesture-handler/ScreenGestureDetector.tsx +4 -4
  69. package/src/gesture-handler/fabricUtils.ts +74 -27
  70. package/src/index.tsx +4 -5
  71. package/src/native-stack/types.tsx +7 -8
  72. package/src/native-stack/views/NativeStackView.tsx +44 -60
  73. package/src/types.tsx +66 -10
@@ -1,14 +1,19 @@
1
1
  /* eslint-disable camelcase */
2
2
  import * as React from 'react';
3
- import { Animated, Platform, StyleSheet, ViewProps } from 'react-native';
3
+ import {
4
+ Animated,
5
+ Platform,
6
+ StyleSheet,
7
+ ViewProps,
8
+ ViewStyle,
9
+ } from 'react-native';
4
10
  // @ts-ignore Getting private component
5
11
  // eslint-disable-next-line import/no-named-as-default, import/default, import/no-named-as-default-member, import/namespace
6
12
  import AppContainer from 'react-native/Libraries/ReactNative/AppContainer';
7
13
  import warnOnce from 'warn-once';
8
- import { StackPresentationTypes, GestureDetectorBridge } from '../../types';
14
+ import { StackPresentationTypes, ScreensRefsHolder } from '../../types';
9
15
  import ScreenStack from '../../components/ScreenStack';
10
16
  import ScreenContentWrapper from '../../components/ScreenContentWrapper';
11
- import { GHContext } from '../contexts/GHContext';
12
17
  import { ScreenContext } from '../../components/Screen';
13
18
  import {
14
19
  ParamListBase,
@@ -27,8 +32,6 @@ import {
27
32
  NativeStackDescriptorMap,
28
33
  NativeStackNavigationHelpers,
29
34
  NativeStackNavigationOptions,
30
- NativeStackNavigatorProps,
31
- ScreensRefsHolder,
32
35
  } from '../types';
33
36
  import HeaderConfig from './HeaderConfig';
34
37
  import SafeAreaProviderCompat from '../utils/SafeAreaProviderCompat';
@@ -69,18 +72,16 @@ const MaybeNestedStack = ({
69
72
  route,
70
73
  stackPresentation,
71
74
  children,
75
+ internalScreenStyle,
72
76
  }: {
73
77
  options: NativeStackNavigationOptions;
74
78
  route: Route<string>;
75
79
  stackPresentation: StackPresentationTypes;
76
80
  children: React.ReactNode;
81
+ internalScreenStyle?: Pick<ViewStyle, 'backgroundColor'>;
77
82
  }) => {
78
83
  const { colors } = useTheme();
79
- const {
80
- headerShown = true,
81
- contentStyle,
82
- unstable_screenStyle = null,
83
- } = options;
84
+ const { headerShown = true, contentStyle } = options;
84
85
 
85
86
  const Screen = React.useContext(ScreenContext);
86
87
 
@@ -150,7 +151,7 @@ const MaybeNestedStack = ({
150
151
  enabled
151
152
  isNativeStack
152
153
  hasLargeHeader={hasLargeHeader}
153
- style={[StyleSheet.absoluteFill, unstable_screenStyle]}>
154
+ style={[StyleSheet.absoluteFill, internalScreenStyle]}>
154
155
  <HeaderHeightContext.Provider value={headerHeight}>
155
156
  <HeaderConfig {...options} route={route} />
156
157
  {content}
@@ -182,7 +183,7 @@ const RouteView = ({
182
183
  index: number;
183
184
  navigation: NativeStackNavigationHelpers;
184
185
  stateKey: string;
185
- screensRefs: ScreensRefsHolder;
186
+ screensRefs: React.MutableRefObject<ScreensRefsHolder>;
186
187
  }) => {
187
188
  const { options, render: renderScene } = descriptors[route.key];
188
189
 
@@ -213,6 +214,7 @@ const RouteView = ({
213
214
  transitionDuration,
214
215
  freezeOnBlur,
215
216
  unstable_sheetFooter = null,
217
+ contentStyle,
216
218
  } = options;
217
219
 
218
220
  let {
@@ -222,14 +224,19 @@ const RouteView = ({
222
224
  gestureResponseDistance,
223
225
  stackAnimation,
224
226
  stackPresentation = 'push',
225
- unstable_screenStyle = null,
226
227
  } = options;
227
228
 
228
- // We only want to allow backgroundColor for now
229
- unstable_screenStyle =
230
- stackPresentation === 'formSheet' && unstable_screenStyle
231
- ? { backgroundColor: unstable_screenStyle.backgroundColor }
232
- : null;
229
+ // We take backgroundColor from contentStyle and apply it on Screen.
230
+ // This allows to workaround one issue with truncated
231
+ // content with formSheet presentation.
232
+ let internalScreenStyle;
233
+
234
+ if (stackPresentation === 'formSheet' && contentStyle) {
235
+ const flattenContentStyles = StyleSheet.flatten(contentStyle);
236
+ internalScreenStyle = {
237
+ backgroundColor: flattenContentStyles?.backgroundColor,
238
+ };
239
+ }
233
240
 
234
241
  if (sheetAllowedDetents === 'fitToContents') {
235
242
  sheetAllowedDetents = [-1];
@@ -313,7 +320,7 @@ const RouteView = ({
313
320
  enabled
314
321
  isNativeStack
315
322
  hasLargeHeader={hasLargeHeader}
316
- style={[StyleSheet.absoluteFill, unstable_screenStyle]}
323
+ style={[StyleSheet.absoluteFill, internalScreenStyle]}
317
324
  sheetAllowedDetents={sheetAllowedDetents}
318
325
  sheetLargestUndimmedDetentIndex={sheetLargestUndimmedDetentIndex}
319
326
  sheetGrabberVisible={sheetGrabberVisible}
@@ -431,7 +438,8 @@ const RouteView = ({
431
438
  <MaybeNestedStack
432
439
  options={options}
433
440
  route={route}
434
- stackPresentation={stackPresentation}>
441
+ stackPresentation={stackPresentation}
442
+ internalScreenStyle={internalScreenStyle}>
435
443
  {renderScene()}
436
444
  </MaybeNestedStack>
437
445
  {/* HeaderConfig must not be first child of a Screen.
@@ -467,53 +475,29 @@ function NativeStackViewInner({
467
475
  const currentRouteKey = routes[state.index].key;
468
476
  const { goBackGesture, transitionAnimation, screenEdgeGesture } =
469
477
  descriptors[currentRouteKey].options;
470
- const gestureDetectorBridge = React.useRef<GestureDetectorBridge>({
471
- stackUseEffectCallback: _stackRef => {
472
- // this method will be override in GestureDetector
473
- },
474
- });
475
- type RefHolder = Record<
476
- string,
477
- React.MutableRefObject<React.Ref<NativeStackNavigatorProps>>
478
- >;
479
- const screensRefs = React.useRef<RefHolder>({});
480
- const ScreenGestureDetector = React.useContext(GHContext);
481
478
 
482
- React.useEffect(() => {
483
- if (
484
- ScreenGestureDetector.name !== 'GHWrapper' &&
485
- goBackGesture !== undefined
486
- ) {
487
- console.warn(
488
- 'Cannot detect GestureDetectorProvider in a screen that uses `goBackGesture`. Make sure your navigator is wrapped in GestureDetectorProvider.',
489
- );
490
- }
491
- }, [ScreenGestureDetector.name, goBackGesture]);
479
+ const screensRefs = React.useRef<ScreensRefsHolder>({});
492
480
 
493
481
  return (
494
- <ScreenGestureDetector
495
- gestureDetectorBridge={gestureDetectorBridge}
482
+ <ScreenStack
483
+ style={styles.container}
496
484
  goBackGesture={goBackGesture}
497
485
  transitionAnimation={transitionAnimation}
498
486
  screenEdgeGesture={screenEdgeGesture ?? false}
499
487
  screensRefs={screensRefs}
500
- currentRouteKey={currentRouteKey}>
501
- <ScreenStack
502
- style={styles.container}
503
- gestureDetectorBridge={gestureDetectorBridge}>
504
- {routes.map((route, index) => (
505
- <RouteView
506
- key={route.key}
507
- descriptors={descriptors}
508
- route={route}
509
- index={index}
510
- navigation={navigation}
511
- stateKey={key}
512
- screensRefs={screensRefs}
513
- />
514
- ))}
515
- </ScreenStack>
516
- </ScreenGestureDetector>
488
+ currentScreenId={currentRouteKey}>
489
+ {routes.map((route, index) => (
490
+ <RouteView
491
+ key={route.key}
492
+ descriptors={descriptors}
493
+ route={route}
494
+ index={index}
495
+ navigation={navigation}
496
+ stateKey={key}
497
+ screensRefs={screensRefs}
498
+ />
499
+ ))}
500
+ </ScreenStack>
517
501
  );
518
502
  }
519
503
 
package/src/types.tsx CHANGED
@@ -7,7 +7,6 @@ import {
7
7
  TargetedEvent,
8
8
  TextInputFocusEventData,
9
9
  ColorValue,
10
- ViewStyle,
11
10
  } from 'react-native';
12
11
  import { NativeStackNavigatorProps } from './native-stack/types';
13
12
 
@@ -281,13 +280,6 @@ export interface ScreenProps extends ViewProps {
281
280
  * - "landscape_right" – landscape-right orientation is permitted
282
281
  */
283
282
  screenOrientation?: ScreenOrientationTypes;
284
- /**
285
- * Allows to set background color for the `Screen` component itself.
286
- * This might come handy when using `formSheet` stack presentation, when the content view is clipped.
287
- *
288
- * We plan to get rid of this prop once the workaround is no longer needed.
289
- */
290
- unstable_screenStyle?: Pick<ViewStyle, 'backgroundColor'>;
291
283
  /**
292
284
  * Describes heights where a sheet can rest.
293
285
  * Works only when `presentation` is set to `formSheet`.
@@ -495,13 +487,12 @@ export interface GestureDetectorBridge {
495
487
  ) => void;
496
488
  }
497
489
 
498
- export interface ScreenStackProps extends ViewProps {
490
+ export interface ScreenStackProps extends ViewProps, GestureProps {
499
491
  children?: React.ReactNode;
500
492
  /**
501
493
  * A callback that gets called when the current screen finishes its transition.
502
494
  */
503
495
  onFinishTransitioning?: (e: NativeSyntheticEvent<TargetedEvent>) => void;
504
- gestureDetectorBridge?: React.MutableRefObject<GestureDetectorBridge>;
505
496
  ref?: React.MutableRefObject<React.Ref<View>>;
506
497
  }
507
498
 
@@ -807,3 +798,68 @@ export interface SearchBarProps {
807
798
  */
808
799
  shouldShowHintSearchIcon?: boolean;
809
800
  }
801
+
802
+ /**
803
+ * Custom Screen Transition
804
+ */
805
+
806
+ /**
807
+ * copy from GestureHandler to avoid strong dependency
808
+ */
809
+ export type PanGestureHandlerEventPayload = {
810
+ x: number;
811
+ y: number;
812
+ absoluteX: number;
813
+ absoluteY: number;
814
+ translationX: number;
815
+ translationY: number;
816
+ velocityX: number;
817
+ velocityY: number;
818
+ };
819
+
820
+ /**
821
+ * copy from Reanimated to avoid strong dependency
822
+ */
823
+ export type GoBackGesture =
824
+ | 'swipeRight'
825
+ | 'swipeLeft'
826
+ | 'swipeUp'
827
+ | 'swipeDown'
828
+ | 'verticalSwipe'
829
+ | 'horizontalSwipe'
830
+ | 'twoDimensionalSwipe';
831
+
832
+ export interface MeasuredDimensions {
833
+ x: number;
834
+ y: number;
835
+ width: number;
836
+ height: number;
837
+ pageX: number;
838
+ pageY: number;
839
+ }
840
+
841
+ export type AnimatedScreenTransition = {
842
+ topScreenStyle: (
843
+ event: PanGestureHandlerEventPayload,
844
+ screenSize: MeasuredDimensions,
845
+ ) => Record<string, unknown>;
846
+ belowTopScreenStyle: (
847
+ event: PanGestureHandlerEventPayload,
848
+ screenSize: MeasuredDimensions,
849
+ ) => Record<string, unknown>;
850
+ };
851
+
852
+ export type ScreensRefsHolder = Record<string, React.RefObject<View>>;
853
+
854
+ export interface GestureProps {
855
+ screensRefs?: React.MutableRefObject<ScreensRefsHolder>;
856
+ currentScreenId?: string;
857
+ goBackGesture?: GoBackGesture;
858
+ transitionAnimation?: AnimatedScreenTransition;
859
+ screenEdgeGesture?: boolean;
860
+ }
861
+
862
+ export interface GestureProviderProps extends GestureProps {
863
+ children?: React.ReactNode;
864
+ gestureDetectorBridge: React.MutableRefObject<GestureDetectorBridge>;
865
+ }