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.
- package/ios/RNSConvert.mm +1 -1
- package/ios/RNSScreenStack.mm +16 -3
- package/lib/commonjs/components/DebugContainer.js.map +1 -1
- package/lib/commonjs/components/DebugContainer.web.js.map +1 -1
- package/lib/commonjs/components/Screen.js.map +1 -1
- package/lib/commonjs/components/ScreenStack.js +40 -7
- package/lib/commonjs/components/ScreenStack.js.map +1 -1
- package/lib/commonjs/components/ScreenStackItem.js +35 -2
- package/lib/commonjs/components/ScreenStackItem.js.map +1 -1
- package/lib/commonjs/contexts.js +11 -0
- package/lib/commonjs/contexts.js.map +1 -0
- package/lib/commonjs/gesture-handler/GestureDetectorProvider.js +2 -2
- package/lib/commonjs/gesture-handler/GestureDetectorProvider.js.map +1 -1
- package/lib/commonjs/gesture-handler/ScreenGestureDetector.js +3 -3
- package/lib/commonjs/gesture-handler/ScreenGestureDetector.js.map +1 -1
- package/lib/commonjs/gesture-handler/fabricUtils.js +54 -18
- package/lib/commonjs/gesture-handler/fabricUtils.js.map +1 -1
- package/lib/commonjs/index.js +1 -8
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +24 -32
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/components/DebugContainer.js.map +1 -1
- package/lib/module/components/DebugContainer.web.js.map +1 -1
- package/lib/module/components/Screen.js.map +1 -1
- package/lib/module/components/ScreenStack.js +40 -7
- package/lib/module/components/ScreenStack.js.map +1 -1
- package/lib/module/components/ScreenStackItem.js +35 -2
- package/lib/module/components/ScreenStackItem.js.map +1 -1
- package/lib/module/contexts.js +4 -0
- package/lib/module/contexts.js.map +1 -0
- package/lib/module/gesture-handler/GestureDetectorProvider.js +1 -1
- package/lib/module/gesture-handler/GestureDetectorProvider.js.map +1 -1
- package/lib/module/gesture-handler/ScreenGestureDetector.js +3 -3
- package/lib/module/gesture-handler/ScreenGestureDetector.js.map +1 -1
- package/lib/module/gesture-handler/fabricUtils.js +55 -17
- package/lib/module/gesture-handler/fabricUtils.js.map +1 -1
- package/lib/module/index.js +3 -5
- package/lib/module/index.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +24 -32
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/typescript/components/DebugContainer.d.ts.map +1 -1
- package/lib/typescript/components/Screen.d.ts.map +1 -1
- package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
- package/lib/typescript/components/ScreenStackItem.d.ts +1 -0
- package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -1
- package/lib/typescript/contexts.d.ts +5 -0
- package/lib/typescript/contexts.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts +2 -2
- package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts.map +1 -1
- package/lib/typescript/gesture-handler/fabricUtils.d.ts +7 -5
- package/lib/typescript/gesture-handler/fabricUtils.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -4
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +6 -8
- package/lib/typescript/native-stack/types.d.ts.map +1 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +46 -10
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native.config.js +16 -28
- package/src/components/DebugContainer.tsx +2 -2
- package/src/components/DebugContainer.web.tsx +1 -1
- package/src/components/Screen.tsx +4 -7
- package/src/components/ScreenStack.tsx +95 -19
- package/src/components/ScreenStackItem.tsx +56 -16
- package/src/contexts.tsx +9 -0
- package/src/gesture-handler/GestureDetectorProvider.tsx +2 -2
- package/src/gesture-handler/ScreenGestureDetector.tsx +4 -4
- package/src/gesture-handler/fabricUtils.ts +74 -27
- package/src/index.tsx +4 -5
- package/src/native-stack/types.tsx +7 -8
- package/src/native-stack/views/NativeStackView.tsx +44 -60
- package/src/types.tsx +66 -10
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
/* eslint-disable camelcase */
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import {
|
|
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,
|
|
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,
|
|
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
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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,
|
|
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.
|
|
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
|
-
<
|
|
495
|
-
|
|
482
|
+
<ScreenStack
|
|
483
|
+
style={styles.container}
|
|
496
484
|
goBackGesture={goBackGesture}
|
|
497
485
|
transitionAnimation={transitionAnimation}
|
|
498
486
|
screenEdgeGesture={screenEdgeGesture ?? false}
|
|
499
487
|
screensRefs={screensRefs}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
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
|
+
}
|