@applicaster/zapp-react-native-utils 13.0.0-rc.2 → 13.0.0-rc.21

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 (109) hide show
  1. package/actionsExecutor/ActionExecutor.ts +16 -9
  2. package/actionsExecutor/ActionExecutorContext.tsx +74 -9
  3. package/alertUtils/alert.ts +148 -0
  4. package/alertUtils/index.ts +1 -148
  5. package/analyticsUtils/AnalyticPlayerListener.ts +18 -1
  6. package/analyticsUtils/__tests__/__snapshots__/analyticsManagerNoModule.test.js.snap +9 -9
  7. package/analyticsUtils/helpers/hooks.ts +1 -1
  8. package/appUtils/HooksManager/{Hook.js → Hook.ts} +35 -23
  9. package/appUtils/HooksManager/__tests__/__snapshots__/hook.test.js.snap +10 -8
  10. package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +693 -0
  11. package/appUtils/HooksManager/__tests__/hook.test.js +196 -184
  12. package/appUtils/HooksManager/__tests__/hooksManager.test.js +96 -99
  13. package/appUtils/HooksManager/{constants.js → constants.ts} +1 -1
  14. package/appUtils/HooksManager/{index.js → index.ts} +121 -112
  15. package/appUtils/HooksManager/types.ts +119 -0
  16. package/appUtils/RiverFocusManager/index.js +17 -12
  17. package/appUtils/accessibilityManager/index.ts +42 -1
  18. package/appUtils/contextKeysManager/contextResolver.ts +73 -0
  19. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +6 -6
  20. package/appUtils/focusManager/index.ts +90 -63
  21. package/appUtils/focusManager/treeDataStructure/Tree/index.js +25 -3
  22. package/appUtils/focusManager/treeDataStructure/Utils/index.js +1 -3
  23. package/appUtils/focusManager/utils/enums.ts +4 -0
  24. package/appUtils/focusManagerAux/utils/index.ts +4 -3
  25. package/appUtils/{index.js → index.ts} +1 -1
  26. package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +2 -2
  27. package/appUtils/keyCodes/__tests__/keyCodes.test.js +4 -4
  28. package/appUtils/keyCodes/{index.js → index.ts} +2 -0
  29. package/appUtils/keyCodes/keys/index.ts +3 -0
  30. package/appUtils/keyCodes/{keys.android.js → keys/keyEventMapper.ts} +0 -19
  31. package/appUtils/keyCodes/keys/keys.android.ts +18 -0
  32. package/appUtils/keyCodes/keys/keys.ios.ts +25 -0
  33. package/appUtils/keyCodes/keys/keys.ts +15 -0
  34. package/appUtils/keyCodes/{keysByPlatform.js → keys/keysByPlatform.ts} +4 -0
  35. package/appUtils/keyCodes/keysByPlatform.ts +8 -0
  36. package/appUtils/keyInputHandler/KeyInputHandler.ts +68 -0
  37. package/appUtils/orientationHelper.ts +1 -1
  38. package/appUtils/platform/const.ts +14 -0
  39. package/appUtils/platform/platformUtils.ts +17 -15
  40. package/appUtils/playerManager/index.ts +6 -2
  41. package/appUtils/playerManager/player.ts +17 -5
  42. package/appUtils/playerManager/playerFactory.ts +5 -4
  43. package/appUtils/playerManager/playerNative.ts +3 -2
  44. package/appUtils/playerManager/usePlayerControllerSetup.tsx +3 -3
  45. package/arrayUtils/__tests__/__snapshots__/arrayUtils.test.ts.snap +4 -4
  46. package/domUtils/{cookieManager.js → cookieManager.ts} +1 -2
  47. package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +4 -4
  48. package/functionUtils/index.ts +15 -11
  49. package/idleUtils/__tests__/withTimeout$.test.ts +37 -0
  50. package/idleUtils/index.ts +1 -1
  51. package/idleUtils/withTimeout.ts +15 -2
  52. package/logger/const.ts +9 -67
  53. package/manifestUtils/__tests__/createConfig.test.js +18 -16
  54. package/modalState/index.ts +1 -5
  55. package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +6 -6
  56. package/navigationUtils/__tests__/itemTypes.test.js +2 -2
  57. package/navigationUtils/__tests__/navigationUtils.test.js +2 -2
  58. package/navigationUtils/index.ts +14 -5
  59. package/package.json +3 -2
  60. package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +1 -1
  61. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +1 -1
  62. package/reactHooks/cell-click/__tests__/index.test.js +10 -2
  63. package/reactHooks/cell-click/index.ts +7 -1
  64. package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +4 -4
  65. package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +20 -13
  66. package/reactHooks/feed/useFeedLoader.tsx +12 -8
  67. package/reactHooks/feed/usePipesCacheReset.ts +5 -5
  68. package/reactHooks/flatList/__tests__/index.test.tsx +30 -21
  69. package/reactHooks/layout/__tests__/index.test.tsx +10 -10
  70. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +14 -28
  71. package/reactHooks/navigation/__tests__/index.test.tsx +0 -4
  72. package/reactHooks/navigation/index.ts +29 -218
  73. package/reactHooks/navigation/useGetBottomTabBarHeight.ts +12 -0
  74. package/reactHooks/navigation/useGetNavBarTopBorderWidth.ts +14 -0
  75. package/reactHooks/navigation/useGetTabBarHeight.ts +12 -0
  76. package/reactHooks/navigation/useIsScreenActive.ts +17 -0
  77. package/reactHooks/navigation/useNavigationPluginData.ts +15 -0
  78. package/reactHooks/navigation/useNavigationType.ts +15 -0
  79. package/reactHooks/navigation/usePathname.ts +4 -0
  80. package/reactHooks/navigation/useRoute.ts +100 -0
  81. package/reactHooks/navigation/useUniqueRouteSuffix.ts +41 -0
  82. package/reactHooks/player/TVSeekControlller/ISeekController.ts +32 -0
  83. package/reactHooks/player/TVSeekControlller/LongPressSeekController.ts +71 -0
  84. package/reactHooks/player/TVSeekControlller/TVSeekController.ts +258 -0
  85. package/reactHooks/player/TVSeekControlller/TapSeekController.ts +53 -0
  86. package/reactHooks/player/__tests__/{useAutoSeek.test.tsx → useAutoSeek._test.tsx} +2 -3
  87. package/reactHooks/player/const.ts +0 -4
  88. package/reactHooks/player/index.ts +0 -6
  89. package/reactHooks/utils/index.ts +13 -0
  90. package/reactUtils/__tests__/reactUtils.test.js +10 -28
  91. package/reactUtils/createContext/__tests__/__snapshots__/helpers.test.js.snap +19 -19
  92. package/reactUtils/createContext/__tests__/__snapshots__/index.test.js.snap +2 -2
  93. package/reactUtils/createContext/__tests__/__snapshots__/provider.test.js.snap +3 -3
  94. package/reactUtils/createContext/__tests__/helpers.test.js +8 -8
  95. package/reactUtils/index.ts +0 -14
  96. package/theme/__mocks__/index.ts +4 -0
  97. package/time/Timer.ts +1 -1
  98. package/types.ts +1 -0
  99. package/appUtils/keyCodes/keys.ios.js +0 -46
  100. package/reactHooks/player/useAutoSeek.tsx +0 -87
  101. package/reactHooks/player/useSeek.tsx +0 -66
  102. package/reactHooks/player/useTapSeek.tsx +0 -58
  103. /package/appUtils/HooksManager/{logger.js → logger.ts} +0 -0
  104. /package/appUtils/{directionHelper.js → directionHelper.ts} +0 -0
  105. /package/appUtils/keyCodes/{androidTVKeys.js → androidTVKeys.ts} +0 -0
  106. /package/appUtils/keyCodes/{keys.web.js → keys/keys.web.ts} +0 -0
  107. /package/appUtils/{localizationsHelper.js → localizationsHelper.ts} +0 -0
  108. /package/domUtils/{logger.js → logger.ts} +0 -0
  109. /package/reactHooks/player/__tests__/{useTapSeek.test.ts → useTapSeek._test.ts} +0 -0
@@ -1,6 +1,5 @@
1
1
  import * as React from "react";
2
- import { renderHook, act } from "@testing-library/react-hooks";
3
- import { render } from "@testing-library/react-native";
2
+ import { renderHook, render, act } from "@testing-library/react-native";
4
3
  import { View } from "react-native";
5
4
 
6
5
  import { useSequentialLoader, useSequentialRenderItem } from "..";
@@ -66,26 +65,28 @@ describe("flatList hooks", () => {
66
65
 
67
66
  expect(result.current.allLoaded).toBe(false);
68
67
 
69
- result.current.renderItem(
70
- ({ onLoadFinished }) => {
71
- onLoadFinished();
72
- },
73
- { index: 1 }
74
- );
68
+ act(() => {
69
+ result.current.renderItem(
70
+ ({ onLoadFinished }) => {
71
+ onLoadFinished();
72
+ },
73
+ { index: 1 }
74
+ );
75
+ });
75
76
 
76
77
  expect(result.current.allLoaded).toBe(true);
77
78
  });
78
79
  });
79
80
 
80
81
  describe("Rendering wrapper", () => {
81
- it("wraps the elements in the View with display: none style", () => {
82
+ it("wraps the elements in the View with display: none style", async () => {
82
83
  const element1 = { id: 1 };
83
84
  const element2 = { id: 2 };
84
85
  const mockData = [element1, element2];
85
86
 
86
87
  const { result } = renderHook(() => useSequentialRenderItem(mockData));
87
88
 
88
- const { getByTestId } = render(
89
+ const res = render(
89
90
  result.current.renderItem(
90
91
  () => {
91
92
  return <View testID={"test"} />;
@@ -94,7 +95,9 @@ describe("flatList hooks", () => {
94
95
  )
95
96
  );
96
97
 
97
- const element = getByTestId("sequential-river-wrapper-1");
98
+ const element = res.root.findByProps({
99
+ testID: "sequential-river-wrapper-1",
100
+ });
98
101
 
99
102
  expect(element.props.style.display).toEqual("none");
100
103
  });
@@ -106,14 +109,16 @@ describe("flatList hooks", () => {
106
109
 
107
110
  const { result } = renderHook(() => useSequentialRenderItem(mockData));
108
111
 
109
- result.current.renderItem(
110
- ({ onLoadFinished }) => {
111
- onLoadFinished();
112
- },
113
- { item: element1, index: 0 }
114
- );
112
+ act(() => {
113
+ result.current.renderItem(
114
+ ({ onLoadFinished }) => {
115
+ onLoadFinished();
116
+ },
117
+ { item: element1, index: 0 }
118
+ );
119
+ });
115
120
 
116
- const { getByTestId } = render(
121
+ const { root } = render(
117
122
  result.current.renderItem(
118
123
  ({ onLoadFinished }) => {
119
124
  onLoadFinished();
@@ -124,7 +129,9 @@ describe("flatList hooks", () => {
124
129
  )
125
130
  );
126
131
 
127
- const element = getByTestId("sequential-river-wrapper-1");
132
+ const element = root.findByProps({
133
+ testID: "sequential-river-wrapper-1",
134
+ });
128
135
 
129
136
  expect(element.props.style.display).toEqual("flex");
130
137
  });
@@ -136,7 +143,7 @@ describe("flatList hooks", () => {
136
143
 
137
144
  const { result } = renderHook(() => useSequentialRenderItem(mockData));
138
145
 
139
- const { getByTestId } = render(
146
+ const { root } = render(
140
147
  result.current.renderItem(
141
148
  ({ onLoadFinished }) => {
142
149
  onLoadFinished();
@@ -147,7 +154,9 @@ describe("flatList hooks", () => {
147
154
  )
148
155
  );
149
156
 
150
- const element = getByTestId("sequential-river-wrapper-1");
157
+ const element = root.findByProps({
158
+ testID: "sequential-river-wrapper-1",
159
+ });
151
160
 
152
161
  expect(element.props.style.display).toEqual("none");
153
162
  });
@@ -14,10 +14,10 @@ const mocked_return_value = (tv) => ({
14
14
  });
15
15
 
16
16
  const platform = "android";
17
- let tv_flag = false;
17
+ let mock_tv_flag = false;
18
18
 
19
19
  ReactNative.Dimensions.get = jest.fn(
20
- (context) => mocked_return_value(tv_flag)[context]
20
+ (context) => mocked_return_value(mock_tv_flag)[context]
21
21
  );
22
22
 
23
23
  const mockRemoveFn = jest.fn();
@@ -43,7 +43,7 @@ jest.mock("react-native-safe-area-context", () => ({
43
43
 
44
44
  jest.mock("../../../reactUtils", () => ({
45
45
  platformSelect: jest.fn((specs) => specs[platform] || specs.default),
46
- isTV: jest.fn(() => tv_flag),
46
+ isTV: jest.fn(() => mock_tv_flag),
47
47
  }));
48
48
 
49
49
  jest.mock("../../navigation", () => ({
@@ -134,20 +134,20 @@ describe("useDimensions", () => {
134
134
 
135
135
  describe("it applies the scale to the width & height if needed", () => {
136
136
  it("applies the scale on TV, and screen context", () => {
137
- tv_flag = true;
138
- const { screen } = mocked_return_value(tv_flag);
137
+ mock_tv_flag = true;
138
+ const { screen } = mocked_return_value(mock_tv_flag);
139
139
  const { dimensions } = testHook("screen");
140
140
 
141
141
  expect(dimensions).toHaveProperty("height", screen.height * screen.scale);
142
142
  expect(dimensions).toHaveProperty("width", screen.width * screen.scale);
143
143
  expect(dimensions).toHaveProperty("scale", 1);
144
144
 
145
- tv_flag = false;
145
+ mock_tv_flag = false;
146
146
  });
147
147
 
148
148
  it("doesn't apply the scale on mobile with screen context", () => {
149
- tv_flag = false;
150
- const { screen } = mocked_return_value(tv_flag);
149
+ mock_tv_flag = false;
150
+ const { screen } = mocked_return_value(mock_tv_flag);
151
151
  const { dimensions } = testHook("screen");
152
152
 
153
153
  expect(dimensions).toHaveProperty("height", screen.height);
@@ -156,8 +156,8 @@ describe("useDimensions", () => {
156
156
  });
157
157
 
158
158
  it("doesn't apply the scale on TV with window context", () => {
159
- tv_flag = true;
160
- const { window } = mocked_return_value(tv_flag);
159
+ mock_tv_flag = true;
160
+ const { window } = mocked_return_value(mock_tv_flag);
161
161
  const { dimensions } = testHook("window");
162
162
 
163
163
  expect(dimensions).toHaveProperty("height", window.height);
@@ -1,25 +1,14 @@
1
1
  import * as ReactNative from "react-native";
2
+ import NativeDeviceInfo from "react-native/Libraries/Utilities/NativeDeviceInfo";
2
3
 
3
- const mockDimensionsGet = jest.fn(
4
- (type) =>
5
- ({
6
- window: { width: 1, height: 1 },
7
- screen: { width: 360, height: 540 },
8
- }[type])
9
- );
4
+ const mockDimensions = {
5
+ window: { width: 1, height: 1 },
6
+ screen: { width: 360, height: 540 },
7
+ };
10
8
 
11
- ReactNative.Dimensions.get = mockDimensionsGet;
12
-
13
- const mockGetConstants = jest.fn().mockReturnValue({
14
- Dimensions: {
15
- window: { width: 360, height: 540 },
16
- screen: { width: 360, height: 540 },
17
- },
18
- });
9
+ const mockDimensionsGet = jest.fn((type) => mockDimensions[type]);
19
10
 
20
- jest.mock("react-native/Libraries/Utilities/NativeDeviceInfo", () => ({
21
- getConstants: mockGetConstants,
22
- }));
11
+ ReactNative.Dimensions.get = mockDimensionsGet;
23
12
 
24
13
  const { Platform, Dimensions } = ReactNative;
25
14
 
@@ -34,27 +23,24 @@ describe("useDimensions > helpers ( native )", () => {
34
23
 
35
24
  it("should call Dimensions.get for window context", () => {
36
25
  getInitialDimensions("window");
37
- expect(Dimensions.get).toBeCalled();
26
+ expect(Dimensions.get).toHaveBeenCalled();
38
27
  });
39
28
 
40
29
  it("should call Dimensions.get for screen context", () => {
41
30
  getInitialDimensions("screen");
42
- expect(Dimensions.get).toBeCalled();
31
+ expect(Dimensions.get).toHaveBeenCalled();
43
32
  });
44
33
 
45
34
  it("should call NativeDeviceInfo.getConstants for ios when width === height", () => {
46
35
  Platform.OS = "ios";
47
36
 
48
- jest.fn().mockReturnValue({
49
- Dimensions: {
50
- window: { width: 1, height: 1 },
51
- screen: { width: 360, height: 540 },
52
- },
53
- });
37
+ const mockGetConstants = jest
38
+ .spyOn(NativeDeviceInfo, "getConstants")
39
+ .mockReturnValue({ Dimensions: mockDimensions });
54
40
 
55
41
  getInitialDimensions("window");
56
42
 
57
- expect(Dimensions.get).toBeCalled();
58
- expect(mockGetConstants).toBeCalled();
43
+ expect(Dimensions.get).toHaveBeenCalled();
44
+ expect(mockGetConstants).toHaveBeenCalled();
59
45
  });
60
46
  });
@@ -135,10 +135,6 @@ const hookModalWrapper = ({ children }) => (
135
135
  </Provider>
136
136
  );
137
137
 
138
- jest.mock("../../../modalState", () => ({
139
- useModalStore: jest.fn(),
140
- }));
141
-
142
138
  describe("navigation", () => {
143
139
  describe("useRoute", () => {
144
140
  describe("Main stack components", () => {
@@ -1,9 +1,5 @@
1
- /* eslint-disable @typescript-eslint/no-use-before-define */
2
- /* eslint max-len: off */
3
-
4
- import React, { useContext, useEffect, useMemo } from "react";
1
+ import React, { useEffect, useMemo } from "react";
5
2
  import { BackHandler, InteractionManager, NativeModules } from "react-native";
6
- import { useSafeAreaInsets } from "react-native-safe-area-context";
7
3
 
8
4
  import {
9
5
  useContentTypes,
@@ -11,34 +7,36 @@ import {
11
7
  } from "@applicaster/zapp-react-native-redux/hooks";
12
8
  import { HooksManager } from "@applicaster/zapp-react-native-utils/appUtils/HooksManager";
13
9
 
14
- import { legacyScreenData } from "@applicaster/quick-brick-core/App/NavigationProvider/utils";
15
- import {
16
- LONG_KEY_PRESS_TIMEOUT,
17
- QUICK_BRICK_NAVBAR,
18
- QUICK_BRICK_CONTENT,
19
- } from "@applicaster/quick-brick-core/const";
20
- import { useZappHooksModalState } from "@applicaster/zapp-react-dom-ui-components/Components/ZappHooksModal/hooks/useZappHooksModalState";
10
+ import { LONG_KEY_PRESS_TIMEOUT } from "@applicaster/quick-brick-core/const";
21
11
  import { ZappHookModalContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
22
- import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
23
12
  import { HookModalContextT } from "@applicaster/zapp-react-native-ui-components/Contexts/ZappHookModalContext";
24
13
  import { HOOKS_EVENTS } from "../../appUtils/HooksManager/constants";
25
- import {
26
- getNavigationProps,
27
- getRiverFromRoute,
28
- getTargetRoute,
29
- } from "../../navigationUtils";
30
- import { platformSelect } from "../../reactUtils";
14
+ import { getRiverFromRoute, getTargetRoute } from "../../navigationUtils";
31
15
  import { useConnectionInfo } from "../connection";
32
- import { getTargetScreenData } from "../screen/useTargetScreenData";
33
16
 
34
- import { isTV, isWeb } from "@applicaster/zapp-react-native-utils/reactUtils";
17
+ import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
35
18
  import { useNavbarState } from "../screen";
36
- import { useNavigation } from "./useNavigation";
37
- import { useModalStore } from "../../modalState";
38
- import { ScreenDataContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenDataContext";
39
19
 
40
20
  export { useNavigation } from "./useNavigation";
41
21
 
22
+ export { useRoute } from "./useRoute";
23
+
24
+ export { usePathname } from "./usePathname";
25
+
26
+ export { useNavigationPluginData } from "./useNavigationPluginData";
27
+
28
+ export { useNavigationType } from "./useNavigationType";
29
+
30
+ export { useGetBottomTabBarHeight } from "./useGetBottomTabBarHeight";
31
+
32
+ export { useIsScreenActive } from "./useIsScreenActive";
33
+
34
+ export {
35
+ useUniqueRouteSuffix,
36
+ useNavbarId,
37
+ useContentId,
38
+ } from "./useUniqueRouteSuffix";
39
+
42
40
  /**
43
41
  * This function helps to decide wether the navbar should be presented on the screen
44
42
  * based on route and / or screen Data
@@ -125,8 +123,6 @@ export function isNavBarVisible(
125
123
 
126
124
  const { ProfilerBridge } = NativeModules;
127
125
 
128
- export const usePathname = () => React.useContext(PathnameContext);
129
-
130
126
  export const useBackHandler = (cb: () => boolean) => {
131
127
  React.useEffect(() => {
132
128
  BackHandler.addEventListener("hardwareBackPress", cb);
@@ -137,88 +133,6 @@ export const useBackHandler = (cb: () => boolean) => {
137
133
  }, [cb]);
138
134
  };
139
135
 
140
- // starts with modal/
141
- const isModalPathname = (pathname: string) => /^modal\//.test(pathname);
142
-
143
- const isVideoModalPathname = (pathname: string) =>
144
- /^video-modal\//.test(pathname);
145
-
146
- const isHookModalPathname = (pathname: string) =>
147
- /^hooks-modal\//.test(pathname);
148
-
149
- const isHookPathname = (pathname: string) => /^\/hooks\//.test(pathname);
150
-
151
- type VariousScreenData = LegacyNavigationScreenData | ZappRiver | ZappEntry;
152
-
153
- export const useRoute = (): {
154
- screenData: VariousScreenData;
155
- pathname: string;
156
- } => {
157
- const pathname = usePathname() || "";
158
- const navigator = useNavigation();
159
- const screenDataContext = legacyScreenData(useContext(ScreenDataContext));
160
-
161
- const { plugins, contentTypes, rivers } = usePickFromState([
162
- "plugins",
163
- "rivers",
164
- "contentTypes",
165
- ]);
166
-
167
- const { modalState } = useModalStore();
168
- const hookModalState = useZappHooksModalState();
169
-
170
- const modalScreenData = modalState.screen;
171
-
172
- const hookModalScreenData = hookModalState.state.screenData?.payload;
173
-
174
- const videoModalScreenData =
175
- navigator.videoModalState?.item &&
176
- legacyScreenData(
177
- {
178
- entry: navigator.videoModalState?.item as ZappEntry,
179
- screen: getTargetScreenData(
180
- navigator.videoModalState?.item as ZappEntry,
181
- rivers,
182
- contentTypes
183
- ),
184
- },
185
- plugins
186
- );
187
-
188
- // There are 4 route scenarios
189
- // For regular screens take date from navigator stack.
190
- // is path is model grab screenData from modal state
191
- // if path is video modal grab screenData from video state
192
- // if path is hook modal grab screenData from hook state
193
- // if path is hook grab screenData from screenData
194
-
195
- if (isModalPathname(pathname)) {
196
- const screenData = modalScreenData ?? ({} as ZappEntry);
197
-
198
- return { screenData, pathname };
199
- }
200
-
201
- if (isVideoModalPathname(pathname)) {
202
- const screenData = videoModalScreenData as LegacyNavigationScreenData;
203
-
204
- return { screenData, pathname };
205
- }
206
-
207
- if (isHookModalPathname(pathname)) {
208
- const screenData = hookModalScreenData;
209
-
210
- return { screenData, pathname };
211
- }
212
-
213
- if (isHookPathname(pathname)) {
214
- return { screenData: screenDataContext, pathname };
215
- }
216
-
217
- const screenData = screenDataContext;
218
-
219
- return { screenData, pathname };
220
- };
221
-
222
136
  type Callbacks = Partial<{
223
137
  handleHookPresent: ({
224
138
  route,
@@ -320,16 +234,19 @@ export const useZappHooksForEntry = (
320
234
  callbacks?.handleHookComplete?.(props);
321
235
  };
322
236
 
323
- const hookManager = HooksManager(hooksOptions)
237
+ const hookManager = HooksManager(hooksOptions);
238
+
239
+ hookManager.subscriber
324
240
  .on(HOOKS_EVENTS.PRESENT_SCREEN_HOOK, handleHookPresent)
325
241
  .on(HOOKS_EVENTS.ERROR, handleHookError)
326
242
  .on(HOOKS_EVENTS.CANCEL, handleHookCancel)
327
243
  .on(HOOKS_EVENTS.START_BACKGROUND_HOOK, handleBackgroundHook)
328
- .on(HOOKS_EVENTS.COMPLETE, handleHookComplete)
329
- .handleHooks(entry);
244
+ .on(HOOKS_EVENTS.COMPLETE, handleHookComplete);
245
+
246
+ hookManager.handleHooks(entry);
330
247
 
331
248
  return () => {
332
- hookManager
249
+ hookManager.subscriber
333
250
  .removeHandler(HOOKS_EVENTS.PRESENT_SCREEN_HOOK, handleHookPresent)
334
251
  .removeHandler(HOOKS_EVENTS.ERROR, handleHookError)
335
252
  .removeHandler(HOOKS_EVENTS.CANCEL, handleHookCancel)
@@ -339,34 +256,6 @@ export const useZappHooksForEntry = (
339
256
  }, [entry.id]);
340
257
  };
341
258
 
342
- export enum MenuTypes {
343
- drawer = "DRAWER",
344
- bottomTabBar = "BOTTOM_TAB_BAR",
345
- }
346
-
347
- export const useNavigationPluginData = (): ZappNavigation | undefined => {
348
- const {
349
- screenData: useRouteScreenData,
350
- }: { screenData: QuickBrickNavigationData | null } = useRoute();
351
-
352
- const navigations = useRouteScreenData?.targetScreen
353
- ? (useRouteScreenData.targetScreen as ZappRiver).navigations
354
- : (useRouteScreenData as ZappRiver).navigations;
355
-
356
- const navigationMenu = navigations?.find((nav) => nav.category === "menu");
357
-
358
- return navigationMenu;
359
- };
360
-
361
- export const useNavigationType = (): MenuTypes => {
362
- const navigationMenu = useNavigationPluginData();
363
-
364
- return !navigationMenu ||
365
- navigationMenu.navigation_type === "quick_brick_side_menu"
366
- ? MenuTypes.drawer
367
- : MenuTypes.bottomTabBar;
368
- };
369
-
370
259
  export const useProfilerLogging = () => {
371
260
  const logTimestamp = (data: string) =>
372
261
  InteractionManager.runAfterInteractions(() => {
@@ -411,81 +300,3 @@ export const useIsNavBarVisible = (): boolean => {
411
300
 
412
301
  return useMemo(() => visible, [visible]);
413
302
  };
414
-
415
- const useGetNavBarTopBorderWidth = (): number => {
416
- const navigator = useNavigation();
417
-
418
- const navProps = getNavigationProps({
419
- navigator,
420
- title: "",
421
- category: "menu",
422
- });
423
-
424
- return Number(((navProps?.styles as any)?.top_border_width as number) ?? 0);
425
- };
426
-
427
- const TAB_BAR_HEIGHT_IOS = 49;
428
- const TAB_BAR_HEIGHT_ANDROID = 56;
429
-
430
- const useGetTabBarHeight = () =>
431
- platformSelect({
432
- ios: TAB_BAR_HEIGHT_IOS + (useSafeAreaInsets().bottom ?? 0),
433
- android: TAB_BAR_HEIGHT_ANDROID,
434
- }) as number;
435
-
436
- export const useGetBottomTabBarHeight = (): number => {
437
- const topBorderWidth = useGetNavBarTopBorderWidth();
438
- const tabBarHeight = useGetTabBarHeight();
439
-
440
- const isBottomBarNavigation = useNavigationType() === MenuTypes.bottomTabBar;
441
-
442
- return !isBottomBarNavigation ? 0 : tabBarHeight + topBorderWidth;
443
- };
444
-
445
- // If current screen is active/focused (visible to the user)
446
- export const useIsScreenActive = () => {
447
- const pathname = usePathname();
448
- const { currentRoute, videoModalState } = useNavigation();
449
-
450
- if (
451
- videoModalState.visible &&
452
- ["FULLSCREEN", "MAXIMIZED", "PIP"].includes(videoModalState.mode)
453
- ) {
454
- return false;
455
- }
456
-
457
- return pathname === currentRoute;
458
- };
459
-
460
- type Return = (prefix: string) => string;
461
-
462
- export const useUniqueRouteSuffix = (): Return => {
463
- const pathname = usePathname();
464
- const { currentRoute } = useNavigation();
465
-
466
- const suffix = `currentRoute:${currentRoute}_pathname:${pathname}`;
467
-
468
- const withUniqueRouteSuffix = React.useCallback((prefix: string) => {
469
- if (isWeb()) {
470
- // we should use extended route prefix only on Web, where we have stack-navigator
471
- return `${prefix}___${suffix}`;
472
- }
473
-
474
- // for other platforms use previous version
475
- return prefix;
476
- }, []);
477
-
478
- return withUniqueRouteSuffix;
479
- };
480
-
481
- export const useNavbarId = () => {
482
- const withUniqueRouteSuffix = useUniqueRouteSuffix();
483
-
484
- return withUniqueRouteSuffix(QUICK_BRICK_NAVBAR);
485
- };
486
-
487
- export const useContentId = () => {
488
- const withUniqueRouteSuffix = useUniqueRouteSuffix();
489
-
490
- return withUniqueRouteSuffix(QUICK_BRICK_CONTENT);
491
- };
@@ -0,0 +1,12 @@
1
+ import { useGetNavBarTopBorderWidth } from "./useGetNavBarTopBorderWidth";
2
+ import { useGetTabBarHeight } from "./useGetTabBarHeight";
3
+ import { MenuTypes, useNavigationType } from "./useNavigationType";
4
+
5
+ export const useGetBottomTabBarHeight = (): number => {
6
+ const topBorderWidth = useGetNavBarTopBorderWidth();
7
+ const tabBarHeight = useGetTabBarHeight();
8
+
9
+ const isBottomBarNavigation = useNavigationType() === MenuTypes.bottomTabBar;
10
+
11
+ return !isBottomBarNavigation ? 0 : tabBarHeight + topBorderWidth;
12
+ };
@@ -0,0 +1,14 @@
1
+ import { getNavigationProps } from "../../navigationUtils";
2
+ import { useNavigation } from "./useNavigation";
3
+
4
+ export const useGetNavBarTopBorderWidth = (): number => {
5
+ const navigator = useNavigation();
6
+
7
+ const navProps = getNavigationProps({
8
+ navigator,
9
+ title: "",
10
+ category: "menu",
11
+ });
12
+
13
+ return Number(((navProps?.styles as any)?.top_border_width as number) ?? 0);
14
+ };
@@ -0,0 +1,12 @@
1
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
2
+
3
+ import { platformSelect } from "../../reactUtils";
4
+
5
+ const TAB_BAR_HEIGHT_IOS = 49;
6
+ const TAB_BAR_HEIGHT_ANDROID = 56;
7
+
8
+ export const useGetTabBarHeight = () =>
9
+ platformSelect({
10
+ ios: TAB_BAR_HEIGHT_IOS + (useSafeAreaInsets().bottom ?? 0),
11
+ android: TAB_BAR_HEIGHT_ANDROID,
12
+ }) as number;
@@ -0,0 +1,17 @@
1
+ import { useNavigation } from "./useNavigation";
2
+ import { usePathname } from "./usePathname";
3
+
4
+ // If current screen is active/focused (visible to the user)
5
+ export const useIsScreenActive = () => {
6
+ const pathname = usePathname();
7
+ const { currentRoute, videoModalState } = useNavigation();
8
+
9
+ if (
10
+ videoModalState.visible &&
11
+ ["FULLSCREEN", "MAXIMIZED", "PIP"].includes(videoModalState.mode)
12
+ ) {
13
+ return false;
14
+ }
15
+
16
+ return pathname === currentRoute;
17
+ };
@@ -0,0 +1,15 @@
1
+ import { useRoute } from "./useRoute";
2
+
3
+ export const useNavigationPluginData = (): ZappNavigation | undefined => {
4
+ const {
5
+ screenData: useRouteScreenData,
6
+ }: { screenData: QuickBrickNavigationData | null } = useRoute();
7
+
8
+ const navigations = useRouteScreenData?.targetScreen
9
+ ? (useRouteScreenData.targetScreen as ZappRiver).navigations
10
+ : (useRouteScreenData as ZappRiver).navigations;
11
+
12
+ const navigationMenu = navigations?.find((nav) => nav.category === "menu");
13
+
14
+ return navigationMenu;
15
+ };
@@ -0,0 +1,15 @@
1
+ import { useNavigationPluginData } from "./useNavigationPluginData";
2
+
3
+ export enum MenuTypes {
4
+ drawer = "DRAWER",
5
+ bottomTabBar = "BOTTOM_TAB_BAR",
6
+ }
7
+
8
+ export const useNavigationType = (): MenuTypes => {
9
+ const navigationMenu = useNavigationPluginData();
10
+
11
+ return !navigationMenu ||
12
+ navigationMenu.navigation_type === "quick_brick_side_menu"
13
+ ? MenuTypes.drawer
14
+ : MenuTypes.bottomTabBar;
15
+ };
@@ -0,0 +1,4 @@
1
+ import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
2
+ import React from "react";
3
+
4
+ export const usePathname = () => React.useContext(PathnameContext);