@react-navigation/core 6.2.2 → 6.4.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.
Files changed (73) hide show
  1. package/README.md +17 -11
  2. package/lib/commonjs/BaseNavigationContainer.js.map +1 -1
  3. package/lib/commonjs/PreventRemoveContext.js +17 -0
  4. package/lib/commonjs/PreventRemoveContext.js.map +1 -0
  5. package/lib/commonjs/PreventRemoveProvider.js +114 -0
  6. package/lib/commonjs/PreventRemoveProvider.js.map +1 -0
  7. package/lib/commonjs/getStateFromPath.js +1 -1
  8. package/lib/commonjs/getStateFromPath.js.map +1 -1
  9. package/lib/commonjs/index.js +36 -0
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/types.js.map +1 -1
  12. package/lib/commonjs/useComponent.js +22 -12
  13. package/lib/commonjs/useComponent.js.map +1 -1
  14. package/lib/commonjs/useEventEmitter.js +1 -1
  15. package/lib/commonjs/useEventEmitter.js.map +1 -1
  16. package/lib/commonjs/useFocusEffect.js +1 -1
  17. package/lib/commonjs/useFocusEffect.js.map +1 -1
  18. package/lib/commonjs/useKeyedChildListeners.js +2 -2
  19. package/lib/commonjs/useKeyedChildListeners.js.map +1 -1
  20. package/lib/commonjs/useNavigationBuilder.js +4 -2
  21. package/lib/commonjs/useNavigationBuilder.js.map +1 -1
  22. package/lib/commonjs/usePreventRemove.js +59 -0
  23. package/lib/commonjs/usePreventRemove.js.map +1 -0
  24. package/lib/commonjs/usePreventRemoveContext.js +27 -0
  25. package/lib/commonjs/usePreventRemoveContext.js.map +1 -0
  26. package/lib/module/BaseNavigationContainer.js.map +1 -1
  27. package/lib/module/PreventRemoveContext.js +9 -0
  28. package/lib/module/PreventRemoveContext.js.map +1 -0
  29. package/lib/module/PreventRemoveProvider.js +96 -0
  30. package/lib/module/PreventRemoveProvider.js.map +1 -0
  31. package/lib/module/getStateFromPath.js +1 -1
  32. package/lib/module/getStateFromPath.js.map +1 -1
  33. package/lib/module/index.js +4 -0
  34. package/lib/module/index.js.map +1 -1
  35. package/lib/module/types.js.map +1 -1
  36. package/lib/module/useComponent.js +23 -12
  37. package/lib/module/useComponent.js.map +1 -1
  38. package/lib/module/useEventEmitter.js +1 -1
  39. package/lib/module/useEventEmitter.js.map +1 -1
  40. package/lib/module/useFocusEffect.js +1 -1
  41. package/lib/module/useFocusEffect.js.map +1 -1
  42. package/lib/module/useKeyedChildListeners.js +2 -2
  43. package/lib/module/useKeyedChildListeners.js.map +1 -1
  44. package/lib/module/useNavigationBuilder.js +3 -2
  45. package/lib/module/useNavigationBuilder.js.map +1 -1
  46. package/lib/module/usePreventRemove.js +41 -0
  47. package/lib/module/usePreventRemove.js.map +1 -0
  48. package/lib/module/usePreventRemoveContext.js +12 -0
  49. package/lib/module/usePreventRemoveContext.js.map +1 -0
  50. package/lib/typescript/src/PreventRemoveContext.d.ts +13 -0
  51. package/lib/typescript/src/PreventRemoveProvider.d.ts +9 -0
  52. package/lib/typescript/src/index.d.ts +4 -0
  53. package/lib/typescript/src/types.d.ts +10 -6
  54. package/lib/typescript/src/useComponent.d.ts +5 -1
  55. package/lib/typescript/src/useDescriptors.d.ts +3 -3
  56. package/lib/typescript/src/useNavigationBuilder.d.ts +9 -7
  57. package/lib/typescript/src/useNavigationHelpers.d.ts +3 -3
  58. package/lib/typescript/src/usePreventRemove.d.ts +12 -0
  59. package/lib/typescript/src/usePreventRemoveContext.d.ts +4 -0
  60. package/package.json +10 -8
  61. package/src/BaseNavigationContainer.tsx +1 -1
  62. package/src/PreventRemoveContext.tsx +21 -0
  63. package/src/PreventRemoveProvider.tsx +126 -0
  64. package/src/getStateFromPath.tsx +4 -1
  65. package/src/index.tsx +4 -0
  66. package/src/types.tsx +39 -14
  67. package/src/useComponent.tsx +19 -12
  68. package/src/useEventEmitter.tsx +3 -1
  69. package/src/useFocusEffect.tsx +1 -1
  70. package/src/useKeyedChildListeners.tsx +6 -4
  71. package/src/useNavigationBuilder.tsx +9 -5
  72. package/src/usePreventRemove.tsx +51 -0
  73. package/src/usePreventRemoveContext.tsx +15 -0
@@ -19,6 +19,7 @@ import isRecordEqual from './isRecordEqual';
19
19
  import NavigationHelpersContext from './NavigationHelpersContext';
20
20
  import NavigationRouteContext from './NavigationRouteContext';
21
21
  import NavigationStateContext from './NavigationStateContext';
22
+ import PreventRemoveProvider from './PreventRemoveProvider';
22
23
  import Screen from './Screen';
23
24
  import {
24
25
  DefaultNavigatorOptions,
@@ -318,12 +319,13 @@ export default function useNavigationBuilder<
318
319
  }
319
320
 
320
321
  const isStateValid = React.useCallback(
321
- (state) => state.type === undefined || state.type === router.type,
322
+ (state: NavigationState | PartialState<NavigationState>) =>
323
+ state.type === undefined || state.type === router.type,
322
324
  [router.type]
323
325
  );
324
326
 
325
327
  const isStateInitialized = React.useCallback(
326
- (state) =>
328
+ (state: NavigationState | PartialState<NavigationState> | undefined) =>
327
329
  state !== undefined && state.stale === false && isStateValid(state),
328
330
  [isStateValid]
329
331
  );
@@ -690,9 +692,11 @@ export default function useNavigationBuilder<
690
692
  descriptors,
691
693
  });
692
694
 
693
- const NavigationContent = useComponent(NavigationHelpersContext.Provider, {
694
- value: navigation,
695
- });
695
+ const NavigationContent = useComponent((children: React.ReactNode) => (
696
+ <NavigationHelpersContext.Provider value={navigation}>
697
+ <PreventRemoveProvider>{children}</PreventRemoveProvider>
698
+ </NavigationHelpersContext.Provider>
699
+ ));
696
700
 
697
701
  return {
698
702
  state,
@@ -0,0 +1,51 @@
1
+ import type { NavigationAction } from '@react-navigation/routers';
2
+ import { nanoid } from 'nanoid/non-secure';
3
+ import * as React from 'react';
4
+ import useLatestCallback from 'use-latest-callback';
5
+
6
+ import type { EventListenerCallback, EventMapCore } from './types';
7
+ import useNavigation from './useNavigation';
8
+ import usePreventRemoveContext from './usePreventRemoveContext';
9
+ import useRoute from './useRoute';
10
+
11
+ /**
12
+ * Hook to prevent screen from being removed. Can be used to prevent users from leaving the screen.
13
+ *
14
+ * @param preventRemove Boolean indicating whether to prevent screen from being removed.
15
+ * @param callback Function which is executed when screen was prevented from being removed.
16
+ */
17
+ export default function usePreventRemove(
18
+ preventRemove: boolean,
19
+ callback: (options: { data: { action: NavigationAction } }) => void
20
+ ) {
21
+ const [id] = React.useState(() => nanoid());
22
+
23
+ const navigation = useNavigation();
24
+ const { key: routeKey } = useRoute();
25
+
26
+ const { setPreventRemove } = usePreventRemoveContext();
27
+
28
+ React.useEffect(() => {
29
+ setPreventRemove(id, routeKey, preventRemove);
30
+ return () => {
31
+ setPreventRemove(id, routeKey, false);
32
+ };
33
+ }, [setPreventRemove, id, routeKey, preventRemove]);
34
+
35
+ const beforeRemoveListener = useLatestCallback<
36
+ EventListenerCallback<EventMapCore<any>, 'beforeRemove'>
37
+ >((e) => {
38
+ if (!preventRemove) {
39
+ return;
40
+ }
41
+
42
+ e.preventDefault();
43
+
44
+ callback({ data: e.data });
45
+ });
46
+
47
+ React.useEffect(
48
+ () => navigation?.addListener('beforeRemove', beforeRemoveListener),
49
+ [navigation, beforeRemoveListener]
50
+ );
51
+ }
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+
3
+ import PreventRemoveContext from './PreventRemoveContext';
4
+
5
+ export default function usePreventRemoveContext() {
6
+ const value = React.useContext(PreventRemoveContext);
7
+
8
+ if (value == null) {
9
+ throw new Error(
10
+ "Couldn't find the prevent remove context. Is your component inside NavigationContent?"
11
+ );
12
+ }
13
+
14
+ return value;
15
+ }