react-native-screens 3.8.0 → 3.10.2
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/README.md +61 -3
- package/android/build.gradle +0 -2
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +71 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +7 -0
- package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +29 -0
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -1
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +7 -41
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +55 -40
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +19 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +30 -5
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +77 -12
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +13 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +8 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +7 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +1 -0
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +90 -0
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +150 -0
- package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +40 -0
- package/ios/RNSScreen.m +35 -0
- package/ios/RNSScreenStack.m +24 -6
- package/ios/RNSScreenStackHeaderConfig.m +41 -0
- package/lib/commonjs/index.js +24 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.native.js +101 -11
- package/lib/commonjs/index.native.js.map +1 -1
- package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +67 -0
- package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -0
- package/lib/commonjs/native-stack/views/HeaderConfig.js +46 -4
- package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +60 -0
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
- package/lib/commonjs/reanimated/ReanimatedScreen.js +7 -79
- package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +61 -0
- package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -0
- package/lib/commonjs/reanimated/index.js +2 -2
- package/lib/commonjs/reanimated/index.js.map +1 -1
- package/lib/commonjs/utils.js +20 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.native.js +97 -13
- package/lib/module/index.native.js.map +1 -1
- package/lib/module/native-stack/utils/useBackPressSubscription.js +50 -0
- package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -0
- package/lib/module/native-stack/views/HeaderConfig.js +46 -5
- package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js +40 -0
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
- package/lib/module/reanimated/ReanimatedScreen.js +6 -73
- package/lib/module/reanimated/ReanimatedScreen.js.map +1 -1
- package/lib/module/reanimated/ReanimatedScreenProvider.js +49 -0
- package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -0
- package/lib/module/reanimated/index.js +1 -1
- package/lib/module/reanimated/index.js.map +1 -1
- package/lib/module/utils.js +8 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/native-stack/types.d.ts +0 -2
- package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +16 -0
- package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +5 -0
- package/lib/typescript/reanimated/ReanimatedScreen.d.ts +5 -2
- package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +2 -0
- package/lib/typescript/reanimated/index.d.ts +1 -1
- package/lib/typescript/types.d.ts +46 -1
- package/lib/typescript/utils.d.ts +2 -0
- package/native-stack/README.md +35 -7
- package/package.json +5 -2
- package/src/index.native.tsx +134 -38
- package/src/index.tsx +10 -0
- package/src/native-stack/types.tsx +0 -2
- package/src/native-stack/utils/useBackPressSubscription.tsx +66 -0
- package/src/native-stack/views/HeaderConfig.tsx +46 -3
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +61 -0
- package/src/reanimated/ReanimatedScreen.tsx +6 -84
- package/src/reanimated/ReanimatedScreenProvider.tsx +42 -0
- package/src/reanimated/index.tsx +1 -1
- package/src/types.tsx +46 -1
- package/src/utils.ts +12 -0
|
@@ -118,6 +118,27 @@
|
|
|
118
118
|
_screenView = nil;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
// this method is never invoked by the system since this view
|
|
122
|
+
// is not added to native view hierarchy so we can apply our logic
|
|
123
|
+
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
|
|
124
|
+
{
|
|
125
|
+
for (RNSScreenStackHeaderSubview *subview in _reactSubviews) {
|
|
126
|
+
if (subview.type == RNSScreenStackHeaderSubviewTypeLeft || subview.type == RNSScreenStackHeaderSubviewTypeRight) {
|
|
127
|
+
// we wrap the headerLeft/Right component in a UIBarButtonItem
|
|
128
|
+
// so we need to use the only subview of it to retrieve the correct view
|
|
129
|
+
UIView *headerComponent = subview.subviews.firstObject;
|
|
130
|
+
// we convert the point to RNSScreenStackView since it always contains the header inside it
|
|
131
|
+
CGPoint convertedPoint = [_screenView.reactSuperview convertPoint:point toView:headerComponent];
|
|
132
|
+
|
|
133
|
+
UIView *hitTestResult = [headerComponent hitTest:convertedPoint withEvent:event];
|
|
134
|
+
if (hitTestResult != nil) {
|
|
135
|
+
return hitTestResult;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return nil;
|
|
140
|
+
}
|
|
141
|
+
|
|
121
142
|
- (void)updateViewControllerIfNeeded
|
|
122
143
|
{
|
|
123
144
|
UIViewController *vc = _screenView.controller;
|
|
@@ -138,10 +159,23 @@
|
|
|
138
159
|
}
|
|
139
160
|
}
|
|
140
161
|
|
|
162
|
+
- (void)layoutNavigationControllerView
|
|
163
|
+
{
|
|
164
|
+
UIViewController *vc = _screenView.controller;
|
|
165
|
+
UINavigationController *navctr = vc.navigationController;
|
|
166
|
+
[navctr.view setNeedsLayout];
|
|
167
|
+
}
|
|
168
|
+
|
|
141
169
|
- (void)didSetProps:(NSArray<NSString *> *)changedProps
|
|
142
170
|
{
|
|
143
171
|
[super didSetProps:changedProps];
|
|
144
172
|
[self updateViewControllerIfNeeded];
|
|
173
|
+
// We need to layout navigation controller view after translucent prop changes, because otherwise
|
|
174
|
+
// frame of RNSScreen will not be changed and screen content will remain the same size.
|
|
175
|
+
// For more details look at https://github.com/software-mansion/react-native-screens/issues/1158
|
|
176
|
+
if ([changedProps containsObject:@"translucent"]) {
|
|
177
|
+
[self layoutNavigationControllerView];
|
|
178
|
+
}
|
|
145
179
|
}
|
|
146
180
|
|
|
147
181
|
- (void)didUpdateReactSubviews
|
|
@@ -556,6 +590,13 @@
|
|
|
556
590
|
break;
|
|
557
591
|
}
|
|
558
592
|
case RNSScreenStackHeaderSubviewTypeSearchBar: {
|
|
593
|
+
if (subview.subviews == nil || [subview.subviews count] == 0) {
|
|
594
|
+
RCTLogWarn(
|
|
595
|
+
@"Failed to attach search bar to the header. We recommend using `useLayoutEffect` when managing "
|
|
596
|
+
"searchBar properties dynamically. \n\nSee: github.com/software-mansion/react-native-screens/issues/1188");
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
599
|
+
|
|
559
600
|
if ([subview.subviews[0] isKindOfClass:[RNSSearchBar class]]) {
|
|
560
601
|
#if !TARGET_OS_TV
|
|
561
602
|
if (@available(iOS 11.0, *)) {
|
package/lib/commonjs/index.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
var _exportNames = {
|
|
7
7
|
enableScreens: true,
|
|
8
8
|
screensEnabled: true,
|
|
9
|
+
enableFreeze: true,
|
|
9
10
|
NativeScreen: true,
|
|
10
11
|
Screen: true,
|
|
11
12
|
ScreenContext: true,
|
|
@@ -23,16 +24,31 @@ var _exportNames = {
|
|
|
23
24
|
SearchBar: true,
|
|
24
25
|
ScreenStackHeaderSubview: true,
|
|
25
26
|
shouldUseActivityState: true,
|
|
26
|
-
useTransitionProgress: true
|
|
27
|
+
useTransitionProgress: true,
|
|
28
|
+
isSearchBarAvailableForCurrentPlatform: true,
|
|
29
|
+
executeNativeBackPress: true
|
|
27
30
|
};
|
|
28
31
|
exports.enableScreens = enableScreens;
|
|
29
32
|
exports.screensEnabled = screensEnabled;
|
|
33
|
+
exports.enableFreeze = enableFreeze;
|
|
30
34
|
Object.defineProperty(exports, "useTransitionProgress", {
|
|
31
35
|
enumerable: true,
|
|
32
36
|
get: function () {
|
|
33
37
|
return _useTransitionProgress.default;
|
|
34
38
|
}
|
|
35
39
|
});
|
|
40
|
+
Object.defineProperty(exports, "isSearchBarAvailableForCurrentPlatform", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
get: function () {
|
|
43
|
+
return _utils.isSearchBarAvailableForCurrentPlatform;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(exports, "executeNativeBackPress", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
get: function () {
|
|
49
|
+
return _utils.executeNativeBackPress;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
36
52
|
exports.shouldUseActivityState = exports.ScreenStackHeaderSubview = exports.SearchBar = exports.ScreenStackHeaderConfig = exports.ScreenStackHeaderSearchBarView = exports.ScreenStackHeaderCenterView = exports.ScreenStackHeaderLeftView = exports.ScreenStackHeaderRightView = exports.ScreenStackHeaderBackButtonImage = exports.FullWindowOverlay = exports.ScreenStack = exports.NativeScreenNavigationContainer = exports.NativeScreenContainer = exports.ScreenContainer = exports.ScreenContext = exports.Screen = exports.NativeScreen = void 0;
|
|
37
53
|
|
|
38
54
|
var _react = _interopRequireDefault(require("react"));
|
|
@@ -55,6 +71,8 @@ Object.keys(_types).forEach(function (key) {
|
|
|
55
71
|
|
|
56
72
|
var _useTransitionProgress = _interopRequireDefault(require("./useTransitionProgress"));
|
|
57
73
|
|
|
74
|
+
var _utils = require("./utils");
|
|
75
|
+
|
|
58
76
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
59
77
|
|
|
60
78
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
@@ -67,6 +85,11 @@ function enableScreens(shouldEnableScreens = true) {
|
|
|
67
85
|
|
|
68
86
|
function screensEnabled() {
|
|
69
87
|
return ENABLE_SCREENS;
|
|
88
|
+
} // @ts-ignore function stub, freezing logic is located in index.native.tsx
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
function enableFreeze(shouldEnableReactFreeze = true) {// noop
|
|
70
93
|
}
|
|
71
94
|
|
|
72
95
|
class NativeScreen extends _react.default.Component {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["ENABLE_SCREENS","enableScreens","shouldEnableScreens","screensEnabled","NativeScreen","React","Component","render","active","activityState","style","enabled","rest","props","undefined","display","Screen","Animated","createAnimatedComponent","ScreenContext","createContext","ScreenContainer","View","NativeScreenContainer","NativeScreenNavigationContainer","ScreenStack","FullWindowOverlay","ScreenStackHeaderBackButtonImage","ScreenStackHeaderRightView","ScreenStackHeaderLeftView","ScreenStackHeaderCenterView","ScreenStackHeaderSearchBarView","ScreenStackHeaderConfig","SearchBar","ScreenStackHeaderSubview","shouldUseActivityState"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["ENABLE_SCREENS","enableScreens","shouldEnableScreens","screensEnabled","enableFreeze","shouldEnableReactFreeze","NativeScreen","React","Component","render","active","activityState","style","enabled","rest","props","undefined","display","Screen","Animated","createAnimatedComponent","ScreenContext","createContext","ScreenContainer","View","NativeScreenContainer","NativeScreenNavigationContainer","ScreenStack","FullWindowOverlay","ScreenStackHeaderBackButtonImage","ScreenStackHeaderRightView","ScreenStackHeaderLeftView","ScreenStackHeaderCenterView","ScreenStackHeaderSearchBarView","ScreenStackHeaderConfig","SearchBar","ScreenStackHeaderSubview","shouldUseActivityState"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAUA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AACA;;;;;;AAKA,IAAIA,cAAc,GAAG,IAArB;;AAEO,SAASC,aAAT,CAAuBC,mBAAmB,GAAG,IAA7C,EAAyD;AAC9DF,EAAAA,cAAc,GAAGE,mBAAjB;AACD;;AAEM,SAASC,cAAT,GAAmC;AACxC,SAAOH,cAAP;AACD,C,CAED;AACA;;;AACO,SAASI,YAAT,CAAsBC,uBAAuB,GAAG,IAAhD,EAA4D,CACjE;AACD;;AAEM,MAAMC,YAAN,SAA2BC,eAAMC,SAAjC,CAAwD;AAC7DC,EAAAA,MAAM,GAAgB;AACpB,QAAI;AACFC,MAAAA,MADE;AAEFC,MAAAA,aAFE;AAGFC,MAAAA,KAHE;AAIFC,MAAAA,OAAO,GAAGb,cAJR;AAKF,SAAGc;AALD,QAMA,KAAKC,KANT;;AAQA,QAAIF,OAAJ,EAAa;AACX,UAAIH,MAAM,KAAKM,SAAX,IAAwBL,aAAa,KAAKK,SAA9C,EAAyD;AACvDL,QAAAA,aAAa,GAAGD,MAAM,KAAK,CAAX,GAAe,CAAf,GAAmB,CAAnC,CADuD,CACjB;AACvC;;AACD,0BACE,6BAAC,iBAAD,CACE;AADF;AAEE,QAAA,MAAM,EAAEC,aAAa,KAAK,CAF5B;AAGE,QAAA,KAAK,EAAE,CAACC,KAAD,EAAQ;AAAEK,UAAAA,OAAO,EAAEN,aAAa,KAAK,CAAlB,GAAsB,MAAtB,GAA+B;AAA1C,SAAR;AAHT,SAIMG,IAJN,EADF;AAQD;;AAED,wBAAO,6BAAC,iBAAD,EAAUA,IAAV,CAAP;AACD;;AAzB4D;;;;AA4BxD,MAAMI,MAAM,GAAGC,sBAASC,uBAAT,CAAiCd,YAAjC,CAAf;;;;AAEA,MAAMe,aAAa,gBAAGd,eAAMe,aAAN,CAAoBJ,MAApB,CAAtB;;;AAEA,MAAMK,eAA0D,GAAGC,iBAAnE;;AAEA,MAAMC,qBAAgE,GAAGD,iBAAzE;;AAEA,MAAME,+BAA0E,GAAGF,iBAAnF;;AAEA,MAAMG,WAAkD,GAAGH,iBAA3D;;AAEA,MAAMI,iBAAiB,GAAGJ,iBAA1B;;;AAEA,MAAMK,gCAAgC,GAC3Cd,KAD8C,iBAG9C,6BAAC,iBAAD,qBACE,6BAAC,kBAAD;AAAO,EAAA,UAAU,EAAC,QAAlB;AAA2B,EAAA,YAAY,EAAE;AAAzC,GAAgDA,KAAhD,EADF,CAHK;;;;AAQA,MAAMe,0BAA0B,GACrCf,KADwC,iBAExB,6BAAC,iBAAD,EAAUA,KAAV,CAFX;;;;AAIA,MAAMgB,yBAAyB,GACpChB,KADuC,iBAEvB,6BAAC,iBAAD,EAAUA,KAAV,CAFX;;;;AAIA,MAAMiB,2BAA2B,GACtCjB,KADyC,iBAEzB,6BAAC,iBAAD,EAAUA,KAAV,CAFX;;;;AAIA,MAAMkB,8BAA8B,GACzClB,KAD4C,iBAE5B,6BAAC,iBAAD,EAAUA,KAAV,CAFX;;;AAIA,MAAMmB,uBAA0E,GAAGV,iBAAnF,C,CAEP;;;AACO,MAAMW,SAA8C,GAAGX,iBAAvD;;AAEA,MAAMY,wBAEX,GAAGZ,iBAFE;;AAIA,MAAMa,sBAAsB,GAAG,IAA/B","sourcesContent":["import React from 'react';\nimport { Animated, View, ViewProps, ImageProps, Image } from 'react-native';\nimport {\n ScreenProps,\n ScreenContainerProps,\n ScreenStackProps,\n ScreenStackHeaderConfigProps,\n HeaderSubviewTypes,\n SearchBarProps,\n} from './types';\n\nexport * from './types';\nexport { default as useTransitionProgress } from './useTransitionProgress';\nexport {\n isSearchBarAvailableForCurrentPlatform,\n executeNativeBackPress,\n} from './utils';\n\nlet ENABLE_SCREENS = true;\n\nexport function enableScreens(shouldEnableScreens = true): void {\n ENABLE_SCREENS = shouldEnableScreens;\n}\n\nexport function screensEnabled(): boolean {\n return ENABLE_SCREENS;\n}\n\n// @ts-ignore function stub, freezing logic is located in index.native.tsx\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function enableFreeze(shouldEnableReactFreeze = true): void {\n // noop\n}\n\nexport class NativeScreen extends React.Component<ScreenProps> {\n render(): JSX.Element {\n let {\n active,\n activityState,\n style,\n enabled = ENABLE_SCREENS,\n ...rest\n } = this.props;\n\n if (enabled) {\n if (active !== undefined && activityState === undefined) {\n activityState = active !== 0 ? 2 : 0; // change taken from index.native.tsx\n }\n return (\n <View\n // @ts-expect-error: hidden exists on web, but not in React Native\n hidden={activityState === 0}\n style={[style, { display: activityState !== 0 ? 'flex' : 'none' }]}\n {...rest}\n />\n );\n }\n\n return <View {...rest} />;\n }\n}\n\nexport const Screen = Animated.createAnimatedComponent(NativeScreen);\n\nexport const ScreenContext = React.createContext(Screen);\n\nexport const ScreenContainer: React.ComponentType<ScreenContainerProps> = View;\n\nexport const NativeScreenContainer: React.ComponentType<ScreenContainerProps> = View;\n\nexport const NativeScreenNavigationContainer: React.ComponentType<ScreenContainerProps> = View;\n\nexport const ScreenStack: React.ComponentType<ScreenStackProps> = View;\n\nexport const FullWindowOverlay = View;\n\nexport const ScreenStackHeaderBackButtonImage = (\n props: ImageProps\n): JSX.Element => (\n <View>\n <Image resizeMode=\"center\" fadeDuration={0} {...props} />\n </View>\n);\n\nexport const ScreenStackHeaderRightView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => <View {...props} />;\n\nexport const ScreenStackHeaderLeftView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => <View {...props} />;\n\nexport const ScreenStackHeaderCenterView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => <View {...props} />;\n\nexport const ScreenStackHeaderSearchBarView = (\n props: React.PropsWithChildren<SearchBarProps>\n): JSX.Element => <View {...props} />;\n\nexport const ScreenStackHeaderConfig: React.ComponentType<ScreenStackHeaderConfigProps> = View;\n\n// @ts-expect-error: search bar props have no common props with View\nexport const SearchBar: React.ComponentType<SearchBarProps> = View;\n\nexport const ScreenStackHeaderSubview: React.ComponentType<React.PropsWithChildren<\n ViewProps & { type?: HeaderSubviewTypes }\n>> = View;\n\nexport const shouldUseActivityState = true;\n"]}
|
|
@@ -4,12 +4,18 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
4
4
|
|
|
5
5
|
var _reactNative = require("react-native");
|
|
6
6
|
|
|
7
|
+
var _reactFreeze = require("react-freeze");
|
|
8
|
+
|
|
7
9
|
var _processColor = _interopRequireDefault(require("react-native/Libraries/StyleSheet/processColor"));
|
|
8
10
|
|
|
11
|
+
var _package = require("react-native/package.json");
|
|
12
|
+
|
|
9
13
|
var _TransitionProgressContext = _interopRequireDefault(require("./TransitionProgressContext"));
|
|
10
14
|
|
|
11
15
|
var _useTransitionProgress = _interopRequireDefault(require("./useTransitionProgress"));
|
|
12
16
|
|
|
17
|
+
var _utils = require("./utils");
|
|
18
|
+
|
|
13
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
20
|
|
|
15
21
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
@@ -26,6 +32,19 @@ function enableScreens(shouldEnableScreens = true) {
|
|
|
26
32
|
if (ENABLE_SCREENS && !_reactNative.UIManager.getViewManagerConfig('RNSScreen')) {
|
|
27
33
|
console.error(`Screen native module hasn't been linked. Please check the react-native-screens README for more details`);
|
|
28
34
|
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let ENABLE_FREEZE = false;
|
|
38
|
+
|
|
39
|
+
function enableFreeze(shouldEnableReactFreeze = true) {
|
|
40
|
+
const minor = parseInt(_package.version.split('.')[1]); // eg. takes 66 from '0.66.0'
|
|
41
|
+
// react-freeze requires react-native >=0.64, react-native from main is 0.0.0
|
|
42
|
+
|
|
43
|
+
if (!(minor === 0 || minor >= 64) && shouldEnableReactFreeze) {
|
|
44
|
+
console.warn('react-freeze library requires at least react-native 0.64. Please upgrade your react-native version in order to use this feature.');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
ENABLE_FREEZE = shouldEnableReactFreeze;
|
|
29
48
|
} // const that tells if the library should use new implementation, will be undefined for older versions
|
|
30
49
|
|
|
31
50
|
|
|
@@ -89,6 +108,63 @@ const ScreensNativeModules = {
|
|
|
89
108
|
|
|
90
109
|
};
|
|
91
110
|
|
|
111
|
+
// This component allows one more render before freezing the screen.
|
|
112
|
+
// Allows activityState to reach the native side and useIsFocused to work correctly.
|
|
113
|
+
function DelayedFreeze({
|
|
114
|
+
freeze,
|
|
115
|
+
children
|
|
116
|
+
}) {
|
|
117
|
+
// flag used for determining whether freeze should be enabled
|
|
118
|
+
const [freezeState, setFreezeState] = _react.default.useState(false);
|
|
119
|
+
|
|
120
|
+
if (freeze !== freezeState) {
|
|
121
|
+
// setImmediate is executed at the end of the JS execution block.
|
|
122
|
+
// Used here for changing the state right after the render.
|
|
123
|
+
setImmediate(() => {
|
|
124
|
+
setFreezeState(freeze);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return /*#__PURE__*/_react.default.createElement(_reactFreeze.Freeze, {
|
|
129
|
+
freeze: freeze ? freezeState : false
|
|
130
|
+
}, children);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function MaybeFreeze({
|
|
134
|
+
freeze,
|
|
135
|
+
children
|
|
136
|
+
}) {
|
|
137
|
+
if (ENABLE_FREEZE) {
|
|
138
|
+
return /*#__PURE__*/_react.default.createElement(DelayedFreeze, {
|
|
139
|
+
freeze: freeze
|
|
140
|
+
}, children);
|
|
141
|
+
} else {
|
|
142
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function ScreenStack(props) {
|
|
147
|
+
if (ENABLE_FREEZE) {
|
|
148
|
+
const {
|
|
149
|
+
children,
|
|
150
|
+
...rest
|
|
151
|
+
} = props;
|
|
152
|
+
|
|
153
|
+
const size = _react.default.Children.count(children); // freezes all screens except the top one
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
const childrenWithFreeze = _react.default.Children.map(children, (child, index) => /*#__PURE__*/_react.default.createElement(DelayedFreeze, {
|
|
157
|
+
freeze: size - index > 1
|
|
158
|
+
}, child));
|
|
159
|
+
|
|
160
|
+
return /*#__PURE__*/_react.default.createElement(ScreensNativeModules.NativeScreenStack, rest, childrenWithFreeze);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return /*#__PURE__*/_react.default.createElement(ScreensNativeModules.NativeScreenStack, props);
|
|
164
|
+
} // Incomplete type, all accessible properties available at:
|
|
165
|
+
// react-native/Libraries/Components/View/ReactNativeViewViewConfig.js
|
|
166
|
+
|
|
167
|
+
|
|
92
168
|
class Screen extends _react.default.Component {
|
|
93
169
|
constructor(...args) {
|
|
94
170
|
super(...args);
|
|
@@ -141,10 +217,24 @@ class Screen extends _react.default.Component {
|
|
|
141
217
|
}
|
|
142
218
|
|
|
143
219
|
const processedColor = (0, _processColor.default)(statusBarColor);
|
|
144
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
220
|
+
return /*#__PURE__*/_react.default.createElement(MaybeFreeze, {
|
|
221
|
+
freeze: activityState === 0
|
|
222
|
+
}, /*#__PURE__*/_react.default.createElement(AnimatedNativeScreen, _extends({}, props, {
|
|
145
223
|
statusBarColor: processedColor,
|
|
146
|
-
activityState: activityState
|
|
147
|
-
|
|
224
|
+
activityState: activityState // This prevents showing blank screen when navigating between multiple screens with freezing
|
|
225
|
+
// https://github.com/software-mansion/react-native-screens/pull/1208
|
|
226
|
+
,
|
|
227
|
+
ref: ref => {
|
|
228
|
+
var _ref$viewConfig, _ref$viewConfig$valid;
|
|
229
|
+
|
|
230
|
+
if (ref !== null && ref !== void 0 && (_ref$viewConfig = ref.viewConfig) !== null && _ref$viewConfig !== void 0 && (_ref$viewConfig$valid = _ref$viewConfig.validAttributes) !== null && _ref$viewConfig$valid !== void 0 && _ref$viewConfig$valid.style) {
|
|
231
|
+
ref.viewConfig.validAttributes.style = { ...ref.viewConfig.validAttributes.style,
|
|
232
|
+
display: false
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
this.setRef(ref);
|
|
237
|
+
},
|
|
148
238
|
onTransitionProgress: !isNativeStack ? undefined : _reactNative.Animated.event([{
|
|
149
239
|
nativeEvent: {
|
|
150
240
|
progress: this.progress,
|
|
@@ -161,7 +251,7 @@ class Screen extends _react.default.Component {
|
|
|
161
251
|
closing: this.closing,
|
|
162
252
|
goingForward: this.goingForward
|
|
163
253
|
}
|
|
164
|
-
}, children));
|
|
254
|
+
}, children)));
|
|
165
255
|
} else {
|
|
166
256
|
// same reason as above
|
|
167
257
|
let {
|
|
@@ -255,6 +345,7 @@ module.exports = {
|
|
|
255
345
|
Screen,
|
|
256
346
|
ScreenContainer,
|
|
257
347
|
ScreenContext,
|
|
348
|
+
ScreenStack,
|
|
258
349
|
|
|
259
350
|
get NativeScreen() {
|
|
260
351
|
return ScreensNativeModules.NativeScreen;
|
|
@@ -268,10 +359,6 @@ module.exports = {
|
|
|
268
359
|
return ScreensNativeModules.NativeScreenNavigationContainer;
|
|
269
360
|
},
|
|
270
361
|
|
|
271
|
-
get ScreenStack() {
|
|
272
|
-
return ScreensNativeModules.NativeScreenStack;
|
|
273
|
-
},
|
|
274
|
-
|
|
275
362
|
get ScreenStackHeaderConfig() {
|
|
276
363
|
return ScreensNativeModules.NativeScreenStackHeaderConfig;
|
|
277
364
|
},
|
|
@@ -281,8 +368,8 @@ module.exports = {
|
|
|
281
368
|
},
|
|
282
369
|
|
|
283
370
|
get SearchBar() {
|
|
284
|
-
if (
|
|
285
|
-
console.warn('Importing SearchBar is only valid on iOS devices.');
|
|
371
|
+
if (!_utils.isSearchBarAvailableForCurrentPlatform) {
|
|
372
|
+
console.warn('Importing SearchBar is only valid on iOS and Android devices.');
|
|
286
373
|
return _reactNative.View;
|
|
287
374
|
}
|
|
288
375
|
|
|
@@ -306,8 +393,11 @@ module.exports = {
|
|
|
306
393
|
ScreenStackHeaderCenterView,
|
|
307
394
|
ScreenStackHeaderSearchBarView,
|
|
308
395
|
enableScreens,
|
|
396
|
+
enableFreeze,
|
|
309
397
|
screensEnabled,
|
|
310
398
|
shouldUseActivityState,
|
|
311
|
-
useTransitionProgress: _useTransitionProgress.default
|
|
399
|
+
useTransitionProgress: _useTransitionProgress.default,
|
|
400
|
+
isSearchBarAvailableForCurrentPlatform: _utils.isSearchBarAvailableForCurrentPlatform,
|
|
401
|
+
executeNativeBackPress: _utils.executeNativeBackPress
|
|
312
402
|
};
|
|
313
403
|
//# sourceMappingURL=index.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.native.tsx"],"names":["isPlatformSupported","Platform","OS","ENABLE_SCREENS","enableScreens","shouldEnableScreens","UIManager","getViewManagerConfig","console","error","shouldUseActivityState","screensEnabled","NativeScreenValue","NativeScreenContainerValue","NativeScreenNavigationContainerValue","NativeScreenStack","NativeScreenStackHeaderConfig","NativeScreenStackHeaderSubview","AnimatedNativeScreen","NativeSearchBar","NativeFullWindowOverlay","ScreensNativeModules","NativeScreen","NativeScreenContainer","NativeScreenNavigationContainer","Screen","React","Component","Animated","Value","ref","props","onComponentRef","setNativeProps","render","enabled","rest","createAnimatedComponent","active","activityState","children","isNativeStack","statusBarColor","undefined","warn","processedColor","setRef","event","nativeEvent","progress","closing","goingForward","useNativeDriver","style","display","ScreenContainer","hasTwoStates","styles","StyleSheet","create","headerSubview","position","top","right","flexDirection","alignItems","justifyContent","ScreenStackHeaderBackButtonImage","ScreenStackHeaderRightView","ScreenStackHeaderLeftView","ScreenStackHeaderCenterView","ScreenStackHeaderSearchBarView","ScreenContext","createContext","module","exports","ScreenStack","ScreenStackHeaderConfig","ScreenStackHeaderSubview","SearchBar","View","FullWindowOverlay","useTransitionProgress"],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n Animated,\n Image,\n ImageProps,\n Platform,\n requireNativeComponent,\n StyleSheet,\n UIManager,\n View,\n ViewProps,\n} from 'react-native';\n// @ts-ignore Getting private component\n// eslint-disable-next-line import/default\nimport processColor from 'react-native/Libraries/StyleSheet/processColor';\n\nimport TransitionProgressContext from './TransitionProgressContext';\nimport useTransitionProgress from './useTransitionProgress';\nimport {\n StackPresentationTypes,\n StackAnimationTypes,\n BlurEffectTypes,\n ScreenReplaceTypes,\n ScreenOrientationTypes,\n HeaderSubviewTypes,\n ScreenProps,\n ScreenContainerProps,\n ScreenStackProps,\n ScreenStackHeaderConfigProps,\n SearchBarProps,\n} from './types';\n\n// web implementation is taken from `index.tsx`\nconst isPlatformSupported =\n Platform.OS === 'ios' ||\n Platform.OS === 'android' ||\n Platform.OS === 'windows';\n\nlet ENABLE_SCREENS = isPlatformSupported;\n\nfunction enableScreens(shouldEnableScreens = true): void {\n ENABLE_SCREENS = isPlatformSupported && shouldEnableScreens;\n if (ENABLE_SCREENS && !UIManager.getViewManagerConfig('RNSScreen')) {\n console.error(\n `Screen native module hasn't been linked. Please check the react-native-screens README for more details`\n );\n }\n}\n\n// const that tells if the library should use new implementation, will be undefined for older versions\nconst shouldUseActivityState = true;\n\nfunction screensEnabled(): boolean {\n return ENABLE_SCREENS;\n}\n\n// We initialize these lazily so that importing the module doesn't throw error when not linked\n// This is necessary coz libraries such as React Navigation import the library where it may not be enabled\nlet NativeScreenValue: React.ComponentType<ScreenProps>;\nlet NativeScreenContainerValue: React.ComponentType<ScreenContainerProps>;\nlet NativeScreenNavigationContainerValue: React.ComponentType<ScreenContainerProps>;\nlet NativeScreenStack: React.ComponentType<ScreenStackProps>;\nlet NativeScreenStackHeaderConfig: React.ComponentType<ScreenStackHeaderConfigProps>;\nlet NativeScreenStackHeaderSubview: React.ComponentType<React.PropsWithChildren<\n ViewProps & { type?: HeaderSubviewTypes }\n>>;\nlet AnimatedNativeScreen: React.ComponentType<ScreenProps>;\nlet NativeSearchBar: React.ComponentType<SearchBarProps>;\nlet NativeFullWindowOverlay: React.ComponentType<View>;\n\nconst ScreensNativeModules = {\n get NativeScreen() {\n NativeScreenValue =\n NativeScreenValue || requireNativeComponent('RNSScreen');\n return NativeScreenValue;\n },\n\n get NativeScreenContainer() {\n NativeScreenContainerValue =\n NativeScreenContainerValue ||\n requireNativeComponent('RNSScreenContainer');\n return NativeScreenContainerValue;\n },\n\n get NativeScreenNavigationContainer() {\n NativeScreenNavigationContainerValue =\n NativeScreenNavigationContainerValue ||\n (Platform.OS === 'ios'\n ? requireNativeComponent('RNSScreenNavigationContainer')\n : this.NativeScreenContainer);\n return NativeScreenNavigationContainerValue;\n },\n\n get NativeScreenStack() {\n NativeScreenStack =\n NativeScreenStack || requireNativeComponent('RNSScreenStack');\n return NativeScreenStack;\n },\n\n get NativeScreenStackHeaderConfig() {\n NativeScreenStackHeaderConfig =\n NativeScreenStackHeaderConfig ||\n requireNativeComponent('RNSScreenStackHeaderConfig');\n return NativeScreenStackHeaderConfig;\n },\n\n get NativeScreenStackHeaderSubview() {\n NativeScreenStackHeaderSubview =\n NativeScreenStackHeaderSubview ||\n requireNativeComponent('RNSScreenStackHeaderSubview');\n return NativeScreenStackHeaderSubview;\n },\n\n get NativeSearchBar() {\n NativeSearchBar = NativeSearchBar || requireNativeComponent('RNSSearchBar');\n return NativeSearchBar;\n },\n\n get NativeFullWindowOverlay() {\n NativeFullWindowOverlay =\n NativeFullWindowOverlay || requireNativeComponent('RNSFullWindowOverlay');\n return NativeFullWindowOverlay;\n },\n};\n\nclass Screen extends React.Component<ScreenProps> {\n private ref: React.ElementRef<typeof View> | null = null;\n private closing = new Animated.Value(0);\n private progress = new Animated.Value(0);\n private goingForward = new Animated.Value(0);\n\n setNativeProps(props: ScreenProps): void {\n this.ref?.setNativeProps(props);\n }\n\n setRef = (ref: React.ElementRef<typeof View> | null): void => {\n this.ref = ref;\n this.props.onComponentRef?.(ref);\n };\n\n render() {\n const { enabled = ENABLE_SCREENS, ...rest } = this.props;\n\n if (enabled && isPlatformSupported) {\n AnimatedNativeScreen =\n AnimatedNativeScreen ||\n Animated.createAnimatedComponent(ScreensNativeModules.NativeScreen);\n\n let {\n // Filter out active prop in this case because it is unused and\n // can cause problems depending on react-native version:\n // https://github.com/react-navigation/react-navigation/issues/4886\n active,\n activityState,\n children,\n isNativeStack,\n statusBarColor,\n ...props\n } = rest;\n\n if (active !== undefined && activityState === undefined) {\n console.warn(\n 'It appears that you are using old version of react-navigation library. Please update @react-navigation/bottom-tabs, @react-navigation/stack and @react-navigation/drawer to version 5.10.0 or above to take full advantage of new functionality added to react-native-screens'\n );\n activityState = active !== 0 ? 2 : 0; // in the new version, we need one of the screens to have value of 2 after the transition\n }\n\n const processedColor = processColor(statusBarColor);\n\n return (\n <AnimatedNativeScreen\n {...props}\n statusBarColor={processedColor}\n activityState={activityState}\n ref={this.setRef}\n onTransitionProgress={\n !isNativeStack\n ? undefined\n : Animated.event(\n [\n {\n nativeEvent: {\n progress: this.progress,\n closing: this.closing,\n goingForward: this.goingForward,\n },\n },\n ],\n { useNativeDriver: true }\n )\n }>\n {!isNativeStack ? ( // see comment of this prop in types.tsx for information why it is needed\n children\n ) : (\n <TransitionProgressContext.Provider\n value={{\n progress: this.progress,\n closing: this.closing,\n goingForward: this.goingForward,\n }}>\n {children}\n </TransitionProgressContext.Provider>\n )}\n </AnimatedNativeScreen>\n );\n } else {\n // same reason as above\n let {\n active,\n activityState,\n style,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onComponentRef,\n ...props\n } = rest;\n\n if (active !== undefined && activityState === undefined) {\n activityState = active !== 0 ? 2 : 0;\n }\n return (\n <Animated.View\n style={[style, { display: activityState !== 0 ? 'flex' : 'none' }]}\n ref={this.setRef}\n {...props}\n />\n );\n }\n }\n}\n\nfunction ScreenContainer(props: ScreenContainerProps) {\n const { enabled = ENABLE_SCREENS, hasTwoStates, ...rest } = props;\n\n if (enabled && isPlatformSupported) {\n if (hasTwoStates) {\n return <ScreensNativeModules.NativeScreenNavigationContainer {...rest} />;\n }\n return <ScreensNativeModules.NativeScreenContainer {...rest} />;\n }\n return <View {...rest} />;\n}\n\nconst styles = StyleSheet.create({\n headerSubview: {\n position: 'absolute',\n top: 0,\n right: 0,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nconst ScreenStackHeaderBackButtonImage = (props: ImageProps): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n type=\"back\"\n style={styles.headerSubview}>\n <Image resizeMode=\"center\" fadeDuration={0} {...props} />\n </ScreensNativeModules.NativeScreenStackHeaderSubview>\n);\n\nconst ScreenStackHeaderRightView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"right\"\n style={styles.headerSubview}\n />\n);\n\nconst ScreenStackHeaderLeftView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"left\"\n style={styles.headerSubview}\n />\n);\n\nconst ScreenStackHeaderCenterView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"center\"\n style={styles.headerSubview}\n />\n);\n\nconst ScreenStackHeaderSearchBarView = (\n props: React.PropsWithChildren<SearchBarProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"searchBar\"\n style={styles.headerSubview}\n />\n);\n\nexport type {\n StackPresentationTypes,\n StackAnimationTypes,\n BlurEffectTypes,\n ScreenReplaceTypes,\n ScreenOrientationTypes,\n HeaderSubviewTypes,\n ScreenProps,\n ScreenContainerProps,\n ScreenStackProps,\n ScreenStackHeaderConfigProps,\n SearchBarProps,\n};\n\n// context to be used when the user wants to use enhanced implementation\n// e.g. to use `react-native-reanimated` (see `reanimated` folder in repo)\nconst ScreenContext = React.createContext(Screen);\n\nmodule.exports = {\n // these are classes so they are not evaluated until used\n // so no need to use getters for them\n Screen,\n ScreenContainer,\n ScreenContext,\n\n get NativeScreen() {\n return ScreensNativeModules.NativeScreen;\n },\n\n get NativeScreenContainer() {\n return ScreensNativeModules.NativeScreenContainer;\n },\n\n get NativeScreenNavigationContainer() {\n return ScreensNativeModules.NativeScreenNavigationContainer;\n },\n\n get ScreenStack() {\n return ScreensNativeModules.NativeScreenStack;\n },\n get ScreenStackHeaderConfig() {\n return ScreensNativeModules.NativeScreenStackHeaderConfig;\n },\n get ScreenStackHeaderSubview() {\n return ScreensNativeModules.NativeScreenStackHeaderSubview;\n },\n get SearchBar() {\n if (Platform.OS !== 'ios') {\n console.warn('Importing SearchBar is only valid on iOS devices.');\n return View;\n }\n\n return ScreensNativeModules.NativeSearchBar;\n },\n get FullWindowOverlay() {\n if (Platform.OS !== 'ios') {\n console.warn('Importing FullWindowOverlay is only valid on iOS devices.');\n return View;\n }\n\n return ScreensNativeModules.NativeFullWindowOverlay;\n },\n // these are functions and will not be evaluated until used\n // so no need to use getters for them\n ScreenStackHeaderBackButtonImage,\n ScreenStackHeaderRightView,\n ScreenStackHeaderLeftView,\n ScreenStackHeaderCenterView,\n ScreenStackHeaderSearchBarView,\n\n enableScreens,\n screensEnabled,\n shouldUseActivityState,\n useTransitionProgress,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["index.native.tsx"],"names":["isPlatformSupported","Platform","OS","ENABLE_SCREENS","enableScreens","shouldEnableScreens","UIManager","getViewManagerConfig","console","error","ENABLE_FREEZE","enableFreeze","shouldEnableReactFreeze","minor","parseInt","version","split","warn","shouldUseActivityState","screensEnabled","NativeScreenValue","NativeScreenContainerValue","NativeScreenNavigationContainerValue","NativeScreenStack","NativeScreenStackHeaderConfig","NativeScreenStackHeaderSubview","AnimatedNativeScreen","NativeSearchBar","NativeFullWindowOverlay","ScreensNativeModules","NativeScreen","NativeScreenContainer","NativeScreenNavigationContainer","DelayedFreeze","freeze","children","freezeState","setFreezeState","React","useState","setImmediate","MaybeFreeze","ScreenStack","props","rest","size","Children","count","childrenWithFreeze","map","child","index","Screen","Component","Animated","Value","ref","onComponentRef","setNativeProps","render","enabled","createAnimatedComponent","active","activityState","isNativeStack","statusBarColor","undefined","processedColor","viewConfig","validAttributes","style","display","setRef","event","nativeEvent","progress","closing","goingForward","useNativeDriver","ScreenContainer","hasTwoStates","styles","StyleSheet","create","headerSubview","position","top","right","flexDirection","alignItems","justifyContent","ScreenStackHeaderBackButtonImage","ScreenStackHeaderRightView","ScreenStackHeaderLeftView","ScreenStackHeaderCenterView","ScreenStackHeaderSearchBarView","ScreenContext","createContext","module","exports","ScreenStackHeaderConfig","ScreenStackHeaderSubview","SearchBar","isSearchBarAvailableForCurrentPlatform","View","FullWindowOverlay","useTransitionProgress","executeNativeBackPress"],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n Animated,\n Image,\n ImageProps,\n Platform,\n requireNativeComponent,\n StyleSheet,\n UIManager,\n View,\n ViewProps,\n} from 'react-native';\nimport { Freeze } from 'react-freeze';\n// @ts-ignore Getting private component\n// eslint-disable-next-line import/default\nimport processColor from 'react-native/Libraries/StyleSheet/processColor';\nimport { version } from 'react-native/package.json';\n\nimport TransitionProgressContext from './TransitionProgressContext';\nimport useTransitionProgress from './useTransitionProgress';\nimport {\n StackPresentationTypes,\n StackAnimationTypes,\n BlurEffectTypes,\n ScreenReplaceTypes,\n ScreenOrientationTypes,\n HeaderSubviewTypes,\n ScreenProps,\n ScreenContainerProps,\n ScreenStackProps,\n ScreenStackHeaderConfigProps,\n SearchBarProps,\n} from './types';\nimport {\n isSearchBarAvailableForCurrentPlatform,\n executeNativeBackPress,\n} from './utils';\n\n// web implementation is taken from `index.tsx`\nconst isPlatformSupported =\n Platform.OS === 'ios' ||\n Platform.OS === 'android' ||\n Platform.OS === 'windows';\n\nlet ENABLE_SCREENS = isPlatformSupported;\n\nfunction enableScreens(shouldEnableScreens = true): void {\n ENABLE_SCREENS = isPlatformSupported && shouldEnableScreens;\n if (ENABLE_SCREENS && !UIManager.getViewManagerConfig('RNSScreen')) {\n console.error(\n `Screen native module hasn't been linked. Please check the react-native-screens README for more details`\n );\n }\n}\n\nlet ENABLE_FREEZE = false;\n\nfunction enableFreeze(shouldEnableReactFreeze = true): void {\n const minor = parseInt(version.split('.')[1]); // eg. takes 66 from '0.66.0'\n\n // react-freeze requires react-native >=0.64, react-native from main is 0.0.0\n if (!(minor === 0 || minor >= 64) && shouldEnableReactFreeze) {\n console.warn(\n 'react-freeze library requires at least react-native 0.64. Please upgrade your react-native version in order to use this feature.'\n );\n }\n\n ENABLE_FREEZE = shouldEnableReactFreeze;\n}\n\n// const that tells if the library should use new implementation, will be undefined for older versions\nconst shouldUseActivityState = true;\n\nfunction screensEnabled(): boolean {\n return ENABLE_SCREENS;\n}\n\n// We initialize these lazily so that importing the module doesn't throw error when not linked\n// This is necessary coz libraries such as React Navigation import the library where it may not be enabled\nlet NativeScreenValue: React.ComponentType<ScreenProps>;\nlet NativeScreenContainerValue: React.ComponentType<ScreenContainerProps>;\nlet NativeScreenNavigationContainerValue: React.ComponentType<ScreenContainerProps>;\nlet NativeScreenStack: React.ComponentType<ScreenStackProps>;\nlet NativeScreenStackHeaderConfig: React.ComponentType<ScreenStackHeaderConfigProps>;\nlet NativeScreenStackHeaderSubview: React.ComponentType<React.PropsWithChildren<\n ViewProps & { type?: HeaderSubviewTypes }\n>>;\nlet AnimatedNativeScreen: React.ComponentType<ScreenProps>;\nlet NativeSearchBar: React.ComponentType<SearchBarProps>;\nlet NativeFullWindowOverlay: React.ComponentType<View>;\n\nconst ScreensNativeModules = {\n get NativeScreen() {\n NativeScreenValue =\n NativeScreenValue || requireNativeComponent('RNSScreen');\n return NativeScreenValue;\n },\n\n get NativeScreenContainer() {\n NativeScreenContainerValue =\n NativeScreenContainerValue ||\n requireNativeComponent('RNSScreenContainer');\n return NativeScreenContainerValue;\n },\n\n get NativeScreenNavigationContainer() {\n NativeScreenNavigationContainerValue =\n NativeScreenNavigationContainerValue ||\n (Platform.OS === 'ios'\n ? requireNativeComponent('RNSScreenNavigationContainer')\n : this.NativeScreenContainer);\n return NativeScreenNavigationContainerValue;\n },\n\n get NativeScreenStack() {\n NativeScreenStack =\n NativeScreenStack || requireNativeComponent('RNSScreenStack');\n return NativeScreenStack;\n },\n\n get NativeScreenStackHeaderConfig() {\n NativeScreenStackHeaderConfig =\n NativeScreenStackHeaderConfig ||\n requireNativeComponent('RNSScreenStackHeaderConfig');\n return NativeScreenStackHeaderConfig;\n },\n\n get NativeScreenStackHeaderSubview() {\n NativeScreenStackHeaderSubview =\n NativeScreenStackHeaderSubview ||\n requireNativeComponent('RNSScreenStackHeaderSubview');\n return NativeScreenStackHeaderSubview;\n },\n\n get NativeSearchBar() {\n NativeSearchBar = NativeSearchBar || requireNativeComponent('RNSSearchBar');\n return NativeSearchBar;\n },\n\n get NativeFullWindowOverlay() {\n NativeFullWindowOverlay =\n NativeFullWindowOverlay || requireNativeComponent('RNSFullWindowOverlay');\n return NativeFullWindowOverlay;\n },\n};\n\ninterface FreezeWrapperProps {\n freeze: boolean;\n children: React.ReactNode;\n}\n\n// This component allows one more render before freezing the screen.\n// Allows activityState to reach the native side and useIsFocused to work correctly.\nfunction DelayedFreeze({ freeze, children }: FreezeWrapperProps) {\n // flag used for determining whether freeze should be enabled\n const [freezeState, setFreezeState] = React.useState(false);\n\n if (freeze !== freezeState) {\n // setImmediate is executed at the end of the JS execution block.\n // Used here for changing the state right after the render.\n setImmediate(() => {\n setFreezeState(freeze);\n });\n }\n\n return <Freeze freeze={freeze ? freezeState : false}>{children}</Freeze>;\n}\n\nfunction MaybeFreeze({ freeze, children }: FreezeWrapperProps) {\n if (ENABLE_FREEZE) {\n return <DelayedFreeze freeze={freeze}>{children}</DelayedFreeze>;\n } else {\n return <>{children}</>;\n }\n}\n\nfunction ScreenStack(props: ScreenStackProps) {\n if (ENABLE_FREEZE) {\n const { children, ...rest } = props;\n const size = React.Children.count(children);\n // freezes all screens except the top one\n const childrenWithFreeze = React.Children.map(children, (child, index) => (\n <DelayedFreeze freeze={size - index > 1}>{child}</DelayedFreeze>\n ));\n return (\n <ScreensNativeModules.NativeScreenStack {...rest}>\n {childrenWithFreeze}\n </ScreensNativeModules.NativeScreenStack>\n );\n }\n return <ScreensNativeModules.NativeScreenStack {...props} />;\n}\n\n// Incomplete type, all accessible properties available at:\n// react-native/Libraries/Components/View/ReactNativeViewViewConfig.js\ninterface ViewConfig extends View {\n viewConfig: {\n validAttributes: {\n style: {\n display: boolean;\n };\n };\n };\n}\n\nclass Screen extends React.Component<ScreenProps> {\n private ref: React.ElementRef<typeof View> | null = null;\n private closing = new Animated.Value(0);\n private progress = new Animated.Value(0);\n private goingForward = new Animated.Value(0);\n\n setNativeProps(props: ScreenProps): void {\n this.ref?.setNativeProps(props);\n }\n\n setRef = (ref: React.ElementRef<typeof View> | null): void => {\n this.ref = ref;\n this.props.onComponentRef?.(ref);\n };\n\n render() {\n const { enabled = ENABLE_SCREENS, ...rest } = this.props;\n\n if (enabled && isPlatformSupported) {\n AnimatedNativeScreen =\n AnimatedNativeScreen ||\n Animated.createAnimatedComponent(ScreensNativeModules.NativeScreen);\n\n let {\n // Filter out active prop in this case because it is unused and\n // can cause problems depending on react-native version:\n // https://github.com/react-navigation/react-navigation/issues/4886\n active,\n activityState,\n children,\n isNativeStack,\n statusBarColor,\n ...props\n } = rest;\n\n if (active !== undefined && activityState === undefined) {\n console.warn(\n 'It appears that you are using old version of react-navigation library. Please update @react-navigation/bottom-tabs, @react-navigation/stack and @react-navigation/drawer to version 5.10.0 or above to take full advantage of new functionality added to react-native-screens'\n );\n activityState = active !== 0 ? 2 : 0; // in the new version, we need one of the screens to have value of 2 after the transition\n }\n\n const processedColor = processColor(statusBarColor);\n\n return (\n <MaybeFreeze freeze={activityState === 0}>\n <AnimatedNativeScreen\n {...props}\n statusBarColor={processedColor}\n activityState={activityState}\n // This prevents showing blank screen when navigating between multiple screens with freezing\n // https://github.com/software-mansion/react-native-screens/pull/1208\n ref={(ref: ViewConfig) => {\n if (ref?.viewConfig?.validAttributes?.style) {\n ref.viewConfig.validAttributes.style = {\n ...ref.viewConfig.validAttributes.style,\n display: false,\n };\n }\n this.setRef(ref);\n }}\n onTransitionProgress={\n !isNativeStack\n ? undefined\n : Animated.event(\n [\n {\n nativeEvent: {\n progress: this.progress,\n closing: this.closing,\n goingForward: this.goingForward,\n },\n },\n ],\n { useNativeDriver: true }\n )\n }>\n {!isNativeStack ? ( // see comment of this prop in types.tsx for information why it is needed\n children\n ) : (\n <TransitionProgressContext.Provider\n value={{\n progress: this.progress,\n closing: this.closing,\n goingForward: this.goingForward,\n }}>\n {children}\n </TransitionProgressContext.Provider>\n )}\n </AnimatedNativeScreen>\n </MaybeFreeze>\n );\n } else {\n // same reason as above\n let {\n active,\n activityState,\n style,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onComponentRef,\n ...props\n } = rest;\n\n if (active !== undefined && activityState === undefined) {\n activityState = active !== 0 ? 2 : 0;\n }\n return (\n <Animated.View\n style={[style, { display: activityState !== 0 ? 'flex' : 'none' }]}\n ref={this.setRef}\n {...props}\n />\n );\n }\n }\n}\n\nfunction ScreenContainer(props: ScreenContainerProps) {\n const { enabled = ENABLE_SCREENS, hasTwoStates, ...rest } = props;\n\n if (enabled && isPlatformSupported) {\n if (hasTwoStates) {\n return <ScreensNativeModules.NativeScreenNavigationContainer {...rest} />;\n }\n return <ScreensNativeModules.NativeScreenContainer {...rest} />;\n }\n return <View {...rest} />;\n}\n\nconst styles = StyleSheet.create({\n headerSubview: {\n position: 'absolute',\n top: 0,\n right: 0,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nconst ScreenStackHeaderBackButtonImage = (props: ImageProps): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n type=\"back\"\n style={styles.headerSubview}>\n <Image resizeMode=\"center\" fadeDuration={0} {...props} />\n </ScreensNativeModules.NativeScreenStackHeaderSubview>\n);\n\nconst ScreenStackHeaderRightView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"right\"\n style={styles.headerSubview}\n />\n);\n\nconst ScreenStackHeaderLeftView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"left\"\n style={styles.headerSubview}\n />\n);\n\nconst ScreenStackHeaderCenterView = (\n props: React.PropsWithChildren<ViewProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"center\"\n style={styles.headerSubview}\n />\n);\n\nconst ScreenStackHeaderSearchBarView = (\n props: React.PropsWithChildren<SearchBarProps>\n): JSX.Element => (\n <ScreensNativeModules.NativeScreenStackHeaderSubview\n {...props}\n type=\"searchBar\"\n style={styles.headerSubview}\n />\n);\n\nexport type {\n StackPresentationTypes,\n StackAnimationTypes,\n BlurEffectTypes,\n ScreenReplaceTypes,\n ScreenOrientationTypes,\n HeaderSubviewTypes,\n ScreenProps,\n ScreenContainerProps,\n ScreenStackProps,\n ScreenStackHeaderConfigProps,\n SearchBarProps,\n};\n\n// context to be used when the user wants to use enhanced implementation\n// e.g. to use `react-native-reanimated` (see `reanimated` folder in repo)\nconst ScreenContext = React.createContext(Screen);\n\nmodule.exports = {\n // these are classes so they are not evaluated until used\n // so no need to use getters for them\n Screen,\n ScreenContainer,\n ScreenContext,\n ScreenStack,\n\n get NativeScreen() {\n return ScreensNativeModules.NativeScreen;\n },\n\n get NativeScreenContainer() {\n return ScreensNativeModules.NativeScreenContainer;\n },\n\n get NativeScreenNavigationContainer() {\n return ScreensNativeModules.NativeScreenNavigationContainer;\n },\n\n get ScreenStackHeaderConfig() {\n return ScreensNativeModules.NativeScreenStackHeaderConfig;\n },\n get ScreenStackHeaderSubview() {\n return ScreensNativeModules.NativeScreenStackHeaderSubview;\n },\n get SearchBar() {\n if (!isSearchBarAvailableForCurrentPlatform) {\n console.warn(\n 'Importing SearchBar is only valid on iOS and Android devices.'\n );\n return View;\n }\n\n return ScreensNativeModules.NativeSearchBar;\n },\n get FullWindowOverlay() {\n if (Platform.OS !== 'ios') {\n console.warn('Importing FullWindowOverlay is only valid on iOS devices.');\n return View;\n }\n\n return ScreensNativeModules.NativeFullWindowOverlay;\n },\n // these are functions and will not be evaluated until used\n // so no need to use getters for them\n ScreenStackHeaderBackButtonImage,\n ScreenStackHeaderRightView,\n ScreenStackHeaderLeftView,\n ScreenStackHeaderCenterView,\n ScreenStackHeaderSearchBarView,\n\n enableScreens,\n enableFreeze,\n screensEnabled,\n shouldUseActivityState,\n useTransitionProgress,\n\n isSearchBarAvailableForCurrentPlatform,\n executeNativeBackPress,\n};\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useBackPressSubscription = useBackPressSubscription;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNative = require("react-native");
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* This hook is an abstraction for keeping back press subscription
|
|
16
|
+
* logic in one place.
|
|
17
|
+
*/
|
|
18
|
+
function useBackPressSubscription({
|
|
19
|
+
onBackPress,
|
|
20
|
+
isDisabled
|
|
21
|
+
}) {
|
|
22
|
+
const [isActive, setIsActive] = _react.default.useState(false);
|
|
23
|
+
|
|
24
|
+
const subscription = _react.default.useRef();
|
|
25
|
+
|
|
26
|
+
const clearSubscription = _react.default.useCallback((shouldSetActive = true) => {
|
|
27
|
+
var _subscription$current;
|
|
28
|
+
|
|
29
|
+
(_subscription$current = subscription.current) === null || _subscription$current === void 0 ? void 0 : _subscription$current.remove();
|
|
30
|
+
subscription.current = undefined;
|
|
31
|
+
if (shouldSetActive) setIsActive(false);
|
|
32
|
+
}, []);
|
|
33
|
+
|
|
34
|
+
const createSubscription = _react.default.useCallback(() => {
|
|
35
|
+
if (!isDisabled) {
|
|
36
|
+
var _subscription$current2;
|
|
37
|
+
|
|
38
|
+
(_subscription$current2 = subscription.current) === null || _subscription$current2 === void 0 ? void 0 : _subscription$current2.remove();
|
|
39
|
+
subscription.current = _reactNative.BackHandler.addEventListener('hardwareBackPress', onBackPress);
|
|
40
|
+
setIsActive(true);
|
|
41
|
+
}
|
|
42
|
+
}, [isDisabled, onBackPress]);
|
|
43
|
+
|
|
44
|
+
const handleAttached = _react.default.useCallback(() => {
|
|
45
|
+
if (isActive) {
|
|
46
|
+
createSubscription();
|
|
47
|
+
}
|
|
48
|
+
}, [createSubscription, isActive]);
|
|
49
|
+
|
|
50
|
+
const handleDetached = _react.default.useCallback(() => {
|
|
51
|
+
clearSubscription(false);
|
|
52
|
+
}, [clearSubscription]);
|
|
53
|
+
|
|
54
|
+
_react.default.useEffect(() => {
|
|
55
|
+
if (isDisabled) {
|
|
56
|
+
clearSubscription();
|
|
57
|
+
}
|
|
58
|
+
}, [isDisabled, clearSubscription]);
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
handleAttached,
|
|
62
|
+
handleDetached,
|
|
63
|
+
createSubscription,
|
|
64
|
+
clearSubscription
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=useBackPressSubscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useBackPressSubscription.tsx"],"names":["useBackPressSubscription","onBackPress","isDisabled","isActive","setIsActive","React","useState","subscription","useRef","clearSubscription","useCallback","shouldSetActive","current","remove","undefined","createSubscription","BackHandler","addEventListener","handleAttached","handleDetached","useEffect"],"mappings":";;;;;;;AAAA;;AACA;;;;AAcA;AACA;AACA;AACA;AACO,SAASA,wBAAT,CAAkC;AACvCC,EAAAA,WADuC;AAEvCC,EAAAA;AAFuC,CAAlC,EAG4B;AACjC,QAAM,CAACC,QAAD,EAAWC,WAAX,IAA0BC,eAAMC,QAAN,CAAe,KAAf,CAAhC;;AACA,QAAMC,YAAY,GAAGF,eAAMG,MAAN,EAArB;;AAEA,QAAMC,iBAAiB,GAAGJ,eAAMK,WAAN,CAAkB,CAACC,eAAe,GAAG,IAAnB,KAA4B;AAAA;;AACtE,6BAAAJ,YAAY,CAACK,OAAb,gFAAsBC,MAAtB;AACAN,IAAAA,YAAY,CAACK,OAAb,GAAuBE,SAAvB;AACA,QAAIH,eAAJ,EAAqBP,WAAW,CAAC,KAAD,CAAX;AACtB,GAJyB,EAIvB,EAJuB,CAA1B;;AAMA,QAAMW,kBAAkB,GAAGV,eAAMK,WAAN,CAAkB,MAAM;AACjD,QAAI,CAACR,UAAL,EAAiB;AAAA;;AACf,gCAAAK,YAAY,CAACK,OAAb,kFAAsBC,MAAtB;AACAN,MAAAA,YAAY,CAACK,OAAb,GAAuBI,yBAAYC,gBAAZ,CACrB,mBADqB,EAErBhB,WAFqB,CAAvB;AAIAG,MAAAA,WAAW,CAAC,IAAD,CAAX;AACD;AACF,GAT0B,EASxB,CAACF,UAAD,EAAaD,WAAb,CATwB,CAA3B;;AAWA,QAAMiB,cAAc,GAAGb,eAAMK,WAAN,CAAkB,MAAM;AAC7C,QAAIP,QAAJ,EAAc;AACZY,MAAAA,kBAAkB;AACnB;AACF,GAJsB,EAIpB,CAACA,kBAAD,EAAqBZ,QAArB,CAJoB,CAAvB;;AAMA,QAAMgB,cAAc,GAAGd,eAAMK,WAAN,CAAkB,MAAM;AAC7CD,IAAAA,iBAAiB,CAAC,KAAD,CAAjB;AACD,GAFsB,EAEpB,CAACA,iBAAD,CAFoB,CAAvB;;AAIAJ,iBAAMe,SAAN,CAAgB,MAAM;AACpB,QAAIlB,UAAJ,EAAgB;AACdO,MAAAA,iBAAiB;AAClB;AACF,GAJD,EAIG,CAACP,UAAD,EAAaO,iBAAb,CAJH;;AAMA,SAAO;AACLS,IAAAA,cADK;AAELC,IAAAA,cAFK;AAGLJ,IAAAA,kBAHK;AAILN,IAAAA;AAJK,GAAP;AAMD","sourcesContent":["import React from 'react';\nimport { BackHandler, NativeEventSubscription } from 'react-native';\n\ninterface Args {\n onBackPress: () => boolean;\n isDisabled: boolean;\n}\n\ninterface UseBackPressSubscription {\n handleAttached: () => void;\n handleDetached: () => void;\n createSubscription: () => void;\n clearSubscription: () => void;\n}\n\n/**\n * This hook is an abstraction for keeping back press subscription\n * logic in one place.\n */\nexport function useBackPressSubscription({\n onBackPress,\n isDisabled,\n}: Args): UseBackPressSubscription {\n const [isActive, setIsActive] = React.useState(false);\n const subscription = React.useRef<NativeEventSubscription | undefined>();\n\n const clearSubscription = React.useCallback((shouldSetActive = true) => {\n subscription.current?.remove();\n subscription.current = undefined;\n if (shouldSetActive) setIsActive(false);\n }, []);\n\n const createSubscription = React.useCallback(() => {\n if (!isDisabled) {\n subscription.current?.remove();\n subscription.current = BackHandler.addEventListener(\n 'hardwareBackPress',\n onBackPress\n );\n setIsActive(true);\n }\n }, [isDisabled, onBackPress]);\n\n const handleAttached = React.useCallback(() => {\n if (isActive) {\n createSubscription();\n }\n }, [createSubscription, isActive]);\n\n const handleDetached = React.useCallback(() => {\n clearSubscription(false);\n }, [clearSubscription]);\n\n React.useEffect(() => {\n if (isDisabled) {\n clearSubscription();\n }\n }, [isDisabled, clearSubscription]);\n\n return {\n handleAttached,\n handleDetached,\n createSubscription,\n clearSubscription,\n };\n}\n"]}
|
|
@@ -13,6 +13,8 @@ var _reactNative = require("react-native");
|
|
|
13
13
|
|
|
14
14
|
var _reactNativeScreens = require("react-native-screens");
|
|
15
15
|
|
|
16
|
+
var _useBackPressSubscription = require("../utils/useBackPressSubscription");
|
|
17
|
+
|
|
16
18
|
var _FontProcessor = require("./FontProcessor");
|
|
17
19
|
|
|
18
20
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
@@ -50,8 +52,46 @@ function HeaderConfig({
|
|
|
50
52
|
const {
|
|
51
53
|
colors
|
|
52
54
|
} = (0, _native.useTheme)();
|
|
53
|
-
const tintColor = headerTintColor !== null && headerTintColor !== void 0 ? headerTintColor : colors.primary;
|
|
54
|
-
|
|
55
|
+
const tintColor = headerTintColor !== null && headerTintColor !== void 0 ? headerTintColor : colors.primary; // We need to use back press subscription here to override back button behavior on JS side.
|
|
56
|
+
// Because screens are usually used with react-navigation and this library overrides back button
|
|
57
|
+
// we need to handle it first in case when search bar is open
|
|
58
|
+
|
|
59
|
+
const {
|
|
60
|
+
handleAttached,
|
|
61
|
+
handleDetached,
|
|
62
|
+
clearSubscription,
|
|
63
|
+
createSubscription
|
|
64
|
+
} = (0, _useBackPressSubscription.useBackPressSubscription)({
|
|
65
|
+
onBackPress: _reactNativeScreens.executeNativeBackPress,
|
|
66
|
+
isDisabled: !searchBar || !!searchBar.disableBackButtonOverride
|
|
67
|
+
});
|
|
68
|
+
const [backTitleFontFamily, largeTitleFontFamily, titleFontFamily] = (0, _FontProcessor.processFonts)([headerBackTitleStyle.fontFamily, headerLargeTitleStyle.fontFamily, headerTitleStyle.fontFamily]); // We want to clear clearSubscription only when components unmounts or search bar changes
|
|
69
|
+
|
|
70
|
+
React.useEffect(() => clearSubscription, [searchBar]);
|
|
71
|
+
const processedSearchBarOptions = React.useMemo(() => {
|
|
72
|
+
if (_reactNative.Platform.OS === 'android' && searchBar && !searchBar.disableBackButtonOverride) {
|
|
73
|
+
const onFocus = (...args) => {
|
|
74
|
+
var _searchBar$onFocus;
|
|
75
|
+
|
|
76
|
+
createSubscription();
|
|
77
|
+
(_searchBar$onFocus = searchBar.onFocus) === null || _searchBar$onFocus === void 0 ? void 0 : _searchBar$onFocus.call(searchBar, ...args);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const onClose = (...args) => {
|
|
81
|
+
var _searchBar$onClose;
|
|
82
|
+
|
|
83
|
+
clearSubscription();
|
|
84
|
+
(_searchBar$onClose = searchBar.onClose) === null || _searchBar$onClose === void 0 ? void 0 : _searchBar$onClose.call(searchBar, ...args);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return { ...searchBar,
|
|
88
|
+
onFocus,
|
|
89
|
+
onClose
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return searchBar;
|
|
94
|
+
}, [searchBar, createSubscription, clearSubscription]);
|
|
55
95
|
return /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStackHeaderConfig, {
|
|
56
96
|
backButtonInCustomView: backButtonInCustomView,
|
|
57
97
|
backgroundColor: headerStyle.backgroundColor ? headerStyle.backgroundColor : colors.card,
|
|
@@ -78,7 +118,9 @@ function HeaderConfig({
|
|
|
78
118
|
titleFontSize: headerTitleStyle.fontSize,
|
|
79
119
|
titleFontWeight: headerTitleStyle.fontWeight,
|
|
80
120
|
topInsetEnabled: headerTopInsetEnabled,
|
|
81
|
-
translucent: headerTranslucent === true
|
|
121
|
+
translucent: headerTranslucent === true,
|
|
122
|
+
onAttached: handleAttached,
|
|
123
|
+
onDetached: handleDetached
|
|
82
124
|
}, headerRight !== undefined ? /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStackHeaderRightView, null, headerRight({
|
|
83
125
|
tintColor
|
|
84
126
|
})) : null, backButtonImage !== undefined ? /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStackHeaderBackButtonImage, {
|
|
@@ -88,6 +130,6 @@ function HeaderConfig({
|
|
|
88
130
|
tintColor
|
|
89
131
|
})) : null, headerCenter !== undefined ? /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStackHeaderCenterView, null, headerCenter({
|
|
90
132
|
tintColor
|
|
91
|
-
})) : null,
|
|
133
|
+
})) : null, _reactNativeScreens.isSearchBarAvailableForCurrentPlatform && processedSearchBarOptions !== undefined ? /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStackHeaderSearchBarView, null, /*#__PURE__*/React.createElement(_reactNativeScreens.SearchBar, processedSearchBarOptions)) : null);
|
|
92
134
|
}
|
|
93
135
|
//# sourceMappingURL=HeaderConfig.js.map
|