@react-navigation/core 6.2.0 → 6.3.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 (81) hide show
  1. package/README.md +17 -11
  2. package/lib/commonjs/PreventRemoveContext.js +17 -0
  3. package/lib/commonjs/PreventRemoveContext.js.map +1 -0
  4. package/lib/commonjs/PreventRemoveProvider.js +114 -0
  5. package/lib/commonjs/PreventRemoveProvider.js.map +1 -0
  6. package/lib/commonjs/getStateFromPath.js +1 -1
  7. package/lib/commonjs/getStateFromPath.js.map +1 -1
  8. package/lib/commonjs/index.js +36 -0
  9. package/lib/commonjs/index.js.map +1 -1
  10. package/lib/commonjs/types.js.map +1 -1
  11. package/lib/commonjs/useChildListeners.js +6 -3
  12. package/lib/commonjs/useChildListeners.js.map +1 -1
  13. package/lib/commonjs/useComponent.js +22 -12
  14. package/lib/commonjs/useComponent.js.map +1 -1
  15. package/lib/commonjs/useEventEmitter.js +13 -3
  16. package/lib/commonjs/useEventEmitter.js.map +1 -1
  17. package/lib/commonjs/useFocusEffect.js +1 -1
  18. package/lib/commonjs/useFocusEffect.js.map +1 -1
  19. package/lib/commonjs/useKeyedChildListeners.js +4 -2
  20. package/lib/commonjs/useKeyedChildListeners.js.map +1 -1
  21. package/lib/commonjs/useNavigationBuilder.js +4 -2
  22. package/lib/commonjs/useNavigationBuilder.js.map +1 -1
  23. package/lib/commonjs/useNavigationHelpers.js +0 -4
  24. package/lib/commonjs/useNavigationHelpers.js.map +1 -1
  25. package/lib/commonjs/usePreventRemove.js +59 -0
  26. package/lib/commonjs/usePreventRemove.js.map +1 -0
  27. package/lib/commonjs/usePreventRemoveContext.js +27 -0
  28. package/lib/commonjs/usePreventRemoveContext.js.map +1 -0
  29. package/lib/module/PreventRemoveContext.js +9 -0
  30. package/lib/module/PreventRemoveContext.js.map +1 -0
  31. package/lib/module/PreventRemoveProvider.js +96 -0
  32. package/lib/module/PreventRemoveProvider.js.map +1 -0
  33. package/lib/module/getStateFromPath.js +1 -1
  34. package/lib/module/getStateFromPath.js.map +1 -1
  35. package/lib/module/index.js +4 -0
  36. package/lib/module/index.js.map +1 -1
  37. package/lib/module/types.js.map +1 -1
  38. package/lib/module/useChildListeners.js +6 -3
  39. package/lib/module/useChildListeners.js.map +1 -1
  40. package/lib/module/useComponent.js +23 -12
  41. package/lib/module/useComponent.js.map +1 -1
  42. package/lib/module/useEventEmitter.js +13 -3
  43. package/lib/module/useEventEmitter.js.map +1 -1
  44. package/lib/module/useFocusEffect.js +1 -1
  45. package/lib/module/useFocusEffect.js.map +1 -1
  46. package/lib/module/useKeyedChildListeners.js +4 -2
  47. package/lib/module/useKeyedChildListeners.js.map +1 -1
  48. package/lib/module/useNavigationBuilder.js +3 -2
  49. package/lib/module/useNavigationBuilder.js.map +1 -1
  50. package/lib/module/useNavigationHelpers.js +0 -4
  51. package/lib/module/useNavigationHelpers.js.map +1 -1
  52. package/lib/module/usePreventRemove.js +41 -0
  53. package/lib/module/usePreventRemove.js.map +1 -0
  54. package/lib/module/usePreventRemoveContext.js +12 -0
  55. package/lib/module/usePreventRemoveContext.js.map +1 -0
  56. package/lib/typescript/src/NavigationBuilderContext.d.ts +1 -1
  57. package/lib/typescript/src/PreventRemoveContext.d.ts +13 -0
  58. package/lib/typescript/src/PreventRemoveProvider.d.ts +9 -0
  59. package/lib/typescript/src/index.d.ts +4 -0
  60. package/lib/typescript/src/types.d.ts +10 -6
  61. package/lib/typescript/src/useComponent.d.ts +5 -1
  62. package/lib/typescript/src/useDescriptors.d.ts +3 -3
  63. package/lib/typescript/src/useNavigationBuilder.d.ts +9 -7
  64. package/lib/typescript/src/useNavigationHelpers.d.ts +3 -3
  65. package/lib/typescript/src/usePreventRemove.d.ts +12 -0
  66. package/lib/typescript/src/usePreventRemoveContext.d.ts +4 -0
  67. package/package.json +10 -9
  68. package/src/PreventRemoveContext.tsx +21 -0
  69. package/src/PreventRemoveProvider.tsx +126 -0
  70. package/src/getStateFromPath.tsx +4 -1
  71. package/src/index.tsx +4 -0
  72. package/src/types.tsx +39 -14
  73. package/src/useChildListeners.tsx +5 -3
  74. package/src/useComponent.tsx +19 -12
  75. package/src/useEventEmitter.tsx +14 -3
  76. package/src/useFocusEffect.tsx +1 -1
  77. package/src/useKeyedChildListeners.tsx +8 -4
  78. package/src/useNavigationBuilder.tsx +6 -3
  79. package/src/useNavigationHelpers.tsx +0 -6
  80. package/src/usePreventRemove.tsx +51 -0
  81. package/src/usePreventRemoveContext.tsx +15 -0
@@ -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
+ }