react-native-screens 3.7.0 → 3.9.0

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.
@@ -10,6 +10,7 @@ import {
10
10
  View,
11
11
  ViewProps,
12
12
  } from 'react-native';
13
+ import { Freeze } from 'react-freeze';
13
14
  // @ts-ignore Getting private component
14
15
  // eslint-disable-next-line import/default
15
16
  import processColor from 'react-native/Libraries/StyleSheet/processColor';
@@ -47,6 +48,12 @@ function enableScreens(shouldEnableScreens = true): void {
47
48
  }
48
49
  }
49
50
 
51
+ let ENABLE_FREEZE = false;
52
+
53
+ function enableFreeze(shouldEnableReactFreeze = true): void {
54
+ ENABLE_FREEZE = shouldEnableReactFreeze;
55
+ }
56
+
50
57
  // const that tells if the library should use new implementation, will be undefined for older versions
51
58
  const shouldUseActivityState = true;
52
59
 
@@ -85,7 +92,9 @@ const ScreensNativeModules = {
85
92
  get NativeScreenNavigationContainer() {
86
93
  NativeScreenNavigationContainerValue =
87
94
  NativeScreenNavigationContainerValue ||
88
- requireNativeComponent('RNSScreenNavigationContainer');
95
+ (Platform.OS === 'ios'
96
+ ? requireNativeComponent('RNSScreenNavigationContainer')
97
+ : this.NativeScreenContainer);
89
98
  return NativeScreenNavigationContainerValue;
90
99
  },
91
100
 
@@ -121,6 +130,36 @@ const ScreensNativeModules = {
121
130
  },
122
131
  };
123
132
 
133
+ function MaybeFreeze({
134
+ freeze,
135
+ children,
136
+ }: {
137
+ freeze: boolean;
138
+ children: React.ReactNode;
139
+ }) {
140
+ if (ENABLE_FREEZE) {
141
+ return <Freeze freeze={freeze}>{children}</Freeze>;
142
+ } else {
143
+ return <>{children}</>;
144
+ }
145
+ }
146
+
147
+ function ScreenStack(props: ScreenStackProps) {
148
+ if (ENABLE_FREEZE) {
149
+ const { children, ...rest } = props;
150
+ const count = React.Children.count(children);
151
+ const childrenWithProps = React.Children.map(children, (child, index) => {
152
+ return <Freeze freeze={count - index > 2}>{child}</Freeze>;
153
+ });
154
+ return (
155
+ <ScreensNativeModules.NativeScreenStack {...rest}>
156
+ {childrenWithProps}
157
+ </ScreensNativeModules.NativeScreenStack>
158
+ );
159
+ }
160
+ return <ScreensNativeModules.NativeScreenStack {...props} />;
161
+ }
162
+
124
163
  class Screen extends React.Component<ScreenProps> {
125
164
  private ref: React.ElementRef<typeof View> | null = null;
126
165
  private closing = new Animated.Value(0);
@@ -187,18 +226,20 @@ class Screen extends React.Component<ScreenProps> {
187
226
  { useNativeDriver: true }
188
227
  )
189
228
  }>
190
- {!isNativeStack ? ( // see comment of this prop in types.tsx for information why it is needed
191
- children
192
- ) : (
193
- <TransitionProgressContext.Provider
194
- value={{
195
- progress: this.progress,
196
- closing: this.closing,
197
- goingForward: this.goingForward,
198
- }}>
199
- {children}
200
- </TransitionProgressContext.Provider>
201
- )}
229
+ <MaybeFreeze freeze={activityState === 0}>
230
+ {!isNativeStack ? ( // see comment of this prop in types.tsx for information why it is needed
231
+ children
232
+ ) : (
233
+ <TransitionProgressContext.Provider
234
+ value={{
235
+ progress: this.progress,
236
+ closing: this.closing,
237
+ goingForward: this.goingForward,
238
+ }}>
239
+ {children}
240
+ </TransitionProgressContext.Provider>
241
+ )}
242
+ </MaybeFreeze>
202
243
  </AnimatedNativeScreen>
203
244
  );
204
245
  } else {
@@ -321,6 +362,7 @@ module.exports = {
321
362
  Screen,
322
363
  ScreenContainer,
323
364
  ScreenContext,
365
+ ScreenStack,
324
366
 
325
367
  get NativeScreen() {
326
368
  return ScreensNativeModules.NativeScreen;
@@ -331,15 +373,9 @@ module.exports = {
331
373
  },
332
374
 
333
375
  get NativeScreenNavigationContainer() {
334
- if (Platform.OS === 'ios') {
335
- return ScreensNativeModules.NativeScreenNavigationContainer;
336
- }
337
- return ScreensNativeModules.NativeScreenContainer;
376
+ return ScreensNativeModules.NativeScreenNavigationContainer;
338
377
  },
339
378
 
340
- get ScreenStack() {
341
- return ScreensNativeModules.NativeScreenStack;
342
- },
343
379
  get ScreenStackHeaderConfig() {
344
380
  return ScreensNativeModules.NativeScreenStackHeaderConfig;
345
381
  },
@@ -371,6 +407,7 @@ module.exports = {
371
407
  ScreenStackHeaderSearchBarView,
372
408
 
373
409
  enableScreens,
410
+ enableFreeze,
374
411
  screensEnabled,
375
412
  shouldUseActivityState,
376
413
  useTransitionProgress,
package/src/index.tsx CHANGED
@@ -22,6 +22,12 @@ export function screensEnabled(): boolean {
22
22
  return ENABLE_SCREENS;
23
23
  }
24
24
 
25
+ // @ts-ignore function stub, freezing logic is located in index.native.tsx
26
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
27
+ export function enableFreeze(shouldEnableReactFreeze = true): void {
28
+ // noop
29
+ }
30
+
25
31
  export class NativeScreen extends React.Component<ScreenProps> {
26
32
  render(): JSX.Element {
27
33
  let {