@applicaster/zapp-react-native-utils 12.0.0-rc.6 → 12.0.0-rc.60

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 (82) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +16 -8
  2. package/analyticsUtils/AnalyticsEvents/index.ts +6 -0
  3. package/analyticsUtils/AnalyticsEvents/searchEvents.ts +21 -0
  4. package/analyticsUtils/__tests__/analyticsManager.test.js +75 -73
  5. package/analyticsUtils/events.ts +6 -0
  6. package/analyticsUtils/helpers/hooks.ts +1 -1
  7. package/analyticsUtils/index.tsx +6 -0
  8. package/appUtils/HooksManager/index.js +3 -1
  9. package/appUtils/focusManager/treeDataStructure/Utils/index.js +12 -3
  10. package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +1 -1
  11. package/appUtils/keyCodes/__tests__/keyCodes.test.js +80 -85
  12. package/appUtils/keyCodes/keys.web.js +1 -0
  13. package/appUtils/orientationHelper.ts +1 -1
  14. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +53 -0
  15. package/appUtils/playerManager/conts.ts +5 -0
  16. package/appUtils/playerManager/player.ts +47 -4
  17. package/appUtils/playerManager/playerFactory.ts +15 -1
  18. package/appUtils/playerManager/playerNative.ts +35 -0
  19. package/appUtils/playerManager/usePlayerState.tsx +13 -1
  20. package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +50 -0
  21. package/cellUtils/__tests__/cellUtils.test.ts +48 -0
  22. package/cellUtils/__tests__/fixtures.ts +13 -0
  23. package/cellUtils/index.ts +40 -2
  24. package/dateUtils/index.ts +11 -0
  25. package/focusManager/index.ts +1 -1
  26. package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +2 -2
  27. package/functionUtils/__tests__/functionUtils.test.js +244 -248
  28. package/headersUtils/index.ts +1 -0
  29. package/inflatedUrlUtils/index.ts +4 -4
  30. package/localizationUtils/__tests__/localizationUtils.test.ts +17 -13
  31. package/localizationUtils/index.ts +6 -3
  32. package/logger/index.ts +1 -1
  33. package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
  34. package/manifestUtils/defaultManifestConfigurations/player.js +10 -1
  35. package/manifestUtils/index.js +5 -1
  36. package/manifestUtils/secondaryImage/index.js +18 -15
  37. package/modalState/index.ts +57 -0
  38. package/navigationUtils/index.ts +56 -7
  39. package/numberUtils/index.ts +4 -0
  40. package/package.json +3 -2
  41. package/playerUtils/configurationGenerator.ts +11 -1
  42. package/pluginUtils/index.ts +11 -7
  43. package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +2 -0
  44. package/reactHooks/autoscrolling/__tests__/{useTrackedView.test.ts → useTrackedView.test.tsx} +18 -1
  45. package/reactHooks/cell-click/__tests__/index.test.js +6 -2
  46. package/reactHooks/cell-click/index.ts +2 -2
  47. package/reactHooks/device/index.ts +0 -1
  48. package/reactHooks/device/useIsTablet.tsx +28 -3
  49. package/reactHooks/device/useMemoizedIsTablet.ts +1 -1
  50. package/reactHooks/device/useOrientation.tsx +3 -1
  51. package/reactHooks/feed/__tests__/useInflatedUrl.test.ts +18 -3
  52. package/reactHooks/feed/useInflatedUrl.ts +44 -15
  53. package/reactHooks/flatList/useLoadNextPageIfNeeded.ts +16 -9
  54. package/reactHooks/index.ts +2 -0
  55. package/reactHooks/layout/__tests__/{index.test.js → index.test.tsx} +66 -59
  56. package/reactHooks/layout/getDeviceInfo/index.ts +4 -2
  57. package/reactHooks/layout/index.ts +2 -1
  58. package/reactHooks/layout/types/index.ts +2 -0
  59. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +11 -16
  60. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +12 -14
  61. package/reactHooks/layout/useDimensions/useDimensions.ts +13 -7
  62. package/reactHooks/navigation/__mocks__/index.ts +15 -0
  63. package/reactHooks/navigation/__mocks__/useNavigation.ts +7 -0
  64. package/reactHooks/navigation/__tests__/index.test.tsx +234 -78
  65. package/reactHooks/navigation/index.ts +251 -85
  66. package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +3 -1
  67. package/reactHooks/screen/__mocks__/useScreenContext.ts +3 -1
  68. package/reactHooks/screen/index.ts +2 -0
  69. package/reactHooks/screen/useScreenContext.ts +2 -2
  70. package/reactHooks/screen/useScreenData.ts +1 -1
  71. package/reactHooks/screen/useTargetScreenData.ts +7 -0
  72. package/reactHooks/state/useRivers.ts +3 -1
  73. package/reactHooks/useListenEventBusEvent.ts +1 -4
  74. package/reactHooks/videoModal/hooks/useVideoModalScreenData.tsx +10 -9
  75. package/riverComponetsMeasurementProvider/index.tsx +2 -2
  76. package/stringUtils/index.ts +5 -0
  77. package/testUtils/getByTestId.ts +14 -0
  78. package/testUtils/index.tsx +38 -23
  79. package/types.ts +4 -0
  80. package/reactHooks/device/useIsTablet.android.tsx +0 -14
  81. package/reactHooks/device/useIsTablet.ios.tsx +0 -7
  82. package/reactHooks/device/useIsTablet.web.tsx +0 -3
@@ -1,12 +1,12 @@
1
1
  import React from "react";
2
2
  import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
3
3
  import { renderHook } from "@testing-library/react-hooks";
4
- import { useRoute } from "../index";
4
+ import { useRoute, isNavBarVisible } from "../";
5
5
  import { Provider } from "react-redux";
6
6
  import configureMockStore from "redux-mock-store";
7
7
  import { NavigationContext } from "@applicaster/zapp-react-native-ui-components/Contexts/NavigationContext";
8
8
  import { ZappHookModalContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
9
- import { ROUTE_TYPES } from "../../../navigationUtils/routeTypes";
9
+ import { ROUTE_TYPES } from "@applicaster/zapp-react-native-utils/navigationUtils/routeTypes";
10
10
 
11
11
  const plugins = [];
12
12
 
@@ -45,26 +45,24 @@ const videoItem = {
45
45
  type: { value: "video" },
46
46
  };
47
47
 
48
- const modalItem = {
49
- id: "modal-1",
50
- };
48
+ const mockGetStackForPathname = jest.fn().mockReturnValue(homeStack);
51
49
 
52
50
  const mainStackNavigator = {
53
- getStackForPathname: jest.fn().mockReturnValue(homeStack),
54
- modalState: {},
51
+ getStackForPathname: mockGetStackForPathname,
52
+ getModalState: () => {},
55
53
  videoModalState: {},
54
+ canGoBack: jest.fn(),
56
55
  };
57
56
 
58
- const videoModalNavigator = {
59
- ...mainStackNavigator,
60
- videoModalState: { item: videoItem },
57
+ const _createWrapper = (Wrapper, props) => {
58
+ return function CreatedWrapper({ children }: any) {
59
+ return <Wrapper {...props}>{children}</Wrapper>;
60
+ };
61
61
  };
62
62
 
63
- const modalNavigator = {
63
+ const videoModalNavigator = {
64
64
  ...mainStackNavigator,
65
- modalState: {
66
- screen: modalItem,
67
- },
65
+ videoModalState: { item: videoItem },
68
66
  };
69
67
 
70
68
  const hookModalNavigator = {
@@ -86,7 +84,6 @@ const hookModalContextState = {
86
84
  resetState: jest.fn(),
87
85
  };
88
86
 
89
- const modalPathname = `${ROUTE_TYPES.MODAL}/${modalItem.id}`;
90
87
  const hooksModalPathname = `${ROUTE_TYPES.HOOKS_MODAL}/${hookModalContextState.state.screenData.payload.id}`;
91
88
  const videoModalPathname = `${ROUTE_TYPES.VIDEO_MODAL}/${videoModalNavigator.videoModalState.item.id}`;
92
89
  const mockStore = configureMockStore();
@@ -97,10 +94,16 @@ const store = mockStore({
97
94
  contentTypes,
98
95
  });
99
96
 
100
- const mainStackWrapper = ({ children }) => (
97
+ const mainStackWrapper = ({
98
+ children,
99
+ navigator = {},
100
+ pathname = homeStack.route,
101
+ }) => (
101
102
  <Provider store={store}>
102
- <NavigationContext.Provider value={mainStackNavigator}>
103
- <PathnameContext.Provider value={homeStack.route}>
103
+ <NavigationContext.Provider
104
+ value={{ ...mainStackNavigator, ...navigator, currentRoute: pathname }}
105
+ >
106
+ <PathnameContext.Provider value={pathname}>
104
107
  {children}
105
108
  </PathnameContext.Provider>
106
109
  </NavigationContext.Provider>
@@ -117,16 +120,6 @@ const videoModalWrapper = ({ children }) => (
117
120
  </Provider>
118
121
  );
119
122
 
120
- const modalWrapper = ({ children }) => (
121
- <Provider store={store}>
122
- <NavigationContext.Provider value={modalNavigator}>
123
- <PathnameContext.Provider value={modalPathname}>
124
- {children}
125
- </PathnameContext.Provider>
126
- </NavigationContext.Provider>
127
- </Provider>
128
- );
129
-
130
123
  const hookModalWrapper = ({ children }) => (
131
124
  <Provider store={store}>
132
125
  <ZappHookModalContext.ReactContext.Provider value={hookModalContextState}>
@@ -139,88 +132,251 @@ const hookModalWrapper = ({ children }) => (
139
132
  </Provider>
140
133
  );
141
134
 
142
- describe("useRoute", () => {
143
- describe("Main stack components", () => {
144
- it("should return a correct pathname", () => {
145
- const { result } = renderHook(() => useRoute(), {
146
- wrapper: mainStackWrapper,
135
+ jest.mock("../../../modalState", () => ({
136
+ useModalStore: jest.fn(),
137
+ }));
138
+
139
+ describe("navigation", () => {
140
+ describe("useRoute", () => {
141
+ describe("Main stack components", () => {
142
+ it("should return a correct pathname", () => {
143
+ const { result } = renderHook(() => useRoute(), {
144
+ wrapper: mainStackWrapper,
145
+ });
146
+
147
+ expect(result.current.pathname).toEqual(homeStack.route);
147
148
  });
148
149
 
149
- expect(result.current.pathname).toEqual(homeStack.route);
150
+ it("should return correct screenData information", () => {
151
+ const { result } = renderHook(() => useRoute(), {
152
+ wrapper: mainStackWrapper,
153
+ });
154
+
155
+ expect(result.current.screenData.id).toEqual(entry.id);
156
+
157
+ expect(result.current.screenData.targetScreen.id).toEqual(screen.id);
158
+ });
150
159
  });
151
160
 
152
- it("should return correct screenData information", () => {
153
- const { result } = renderHook(() => useRoute(), {
154
- wrapper: mainStackWrapper,
161
+ describe("Hook modal components", () => {
162
+ it("should return a correct pathname", () => {
163
+ const { result } = renderHook(() => useRoute(), {
164
+ wrapper: hookModalWrapper,
165
+ });
166
+
167
+ expect(result.current.pathname).toEqual(hooksModalPathname);
155
168
  });
156
169
 
157
- expect(result.current.screenData.id).toEqual(entry.id);
170
+ it("should return correct screenData information", () => {
171
+ const { result } = renderHook(() => useRoute(), {
172
+ wrapper: hookModalWrapper,
173
+ });
158
174
 
159
- expect(result.current.screenData.targetScreen.id).toEqual(screen.id);
175
+ expect(result.current.screenData.id).toEqual(
176
+ hookModalContextState.state.screenData.payload.id
177
+ );
178
+ });
160
179
  });
161
- });
162
180
 
163
- describe("Hook modal components", () => {
164
- it("should return a correct pathname", () => {
165
- const { result } = renderHook(() => useRoute(), {
166
- wrapper: hookModalWrapper,
181
+ describe("Video modal components", () => {
182
+ it("should return a correct pathname", () => {
183
+ const { result } = renderHook(() => useRoute(), {
184
+ wrapper: videoModalWrapper,
185
+ });
186
+
187
+ expect(result.current.pathname).toEqual(videoModalPathname);
167
188
  });
168
189
 
169
- expect(result.current.pathname).toEqual(hooksModalPathname);
170
- });
190
+ it("should return correct screenData information", () => {
191
+ const { result } = renderHook(() => useRoute(), {
192
+ wrapper: videoModalWrapper,
193
+ });
194
+
195
+ expect(result.current.screenData.id).toEqual(
196
+ videoModalNavigator.videoModalState.item.id
197
+ );
171
198
 
172
- it("should return correct screenData information", () => {
173
- const { result } = renderHook(() => useRoute(), {
174
- wrapper: hookModalWrapper,
199
+ expect(result.current.screenData.targetScreen.id).toEqual(
200
+ rivers["river-player"].id
201
+ );
175
202
  });
203
+ });
204
+ });
176
205
 
177
- expect(result.current.screenData.id).toEqual(
178
- hookModalContextState.state.screenData.payload.id
206
+ describe("isNavBarVisible", () => {
207
+ it("returns false when the route is a player route", () => {
208
+ const navBarVisible = isNavBarVisible(
209
+ "/playable/some_vod_item",
210
+ {} as ZappRiver,
211
+ false,
212
+ false
179
213
  );
214
+
215
+ expect(navBarVisible).toBe(false);
180
216
  });
181
- });
182
217
 
183
- describe("Video modal components", () => {
184
- it("should return a correct pathname", () => {
185
- const { result } = renderHook(() => useRoute(), {
186
- wrapper: videoModalWrapper,
187
- });
218
+ it("returns false when the next screen is the QB search screen", () => {
219
+ const navBarVisible = isNavBarVisible(
220
+ "/river/A1234",
221
+ {
222
+ type: "qb_search_screen",
223
+ } as any,
224
+ false,
225
+ false
226
+ );
188
227
 
189
- expect(result.current.pathname).toEqual(videoModalPathname);
228
+ expect(navBarVisible).toBe(false);
190
229
  });
191
230
 
192
- it("should return correct screenData information", () => {
193
- const { result } = renderHook(() => useRoute(), {
194
- wrapper: videoModalWrapper,
231
+ describe("when screen is a hook", () => {
232
+ it("returns true if the `showNavBar` flag is set to true", () => {
233
+ const navBarVisible = isNavBarVisible(
234
+ "",
235
+ {
236
+ hookPlugin: {
237
+ module: {
238
+ showNavBar: true,
239
+ },
240
+ },
241
+ } as any,
242
+ false,
243
+ false
244
+ );
245
+
246
+ expect(navBarVisible).toBe(true);
247
+ });
248
+
249
+ it("returns true if presentFullScreen flag is set to false", () => {
250
+ const navBarVisible = isNavBarVisible(
251
+ "",
252
+ {
253
+ hookPlugin: {
254
+ module: {
255
+ presentFullScreen: false,
256
+ },
257
+ },
258
+ } as any,
259
+ false,
260
+ false
261
+ );
262
+
263
+ expect(navBarVisible).toBe(true);
195
264
  });
196
265
 
197
- expect(result.current.screenData.id).toEqual(
198
- videoModalNavigator.videoModalState.item.id
266
+ it("returns false if presentFullScreen flag is set to true", () => {
267
+ const navBarVisible = isNavBarVisible(
268
+ "",
269
+ {
270
+ hookPlugin: {
271
+ module: {
272
+ presentFullScreen: true,
273
+ },
274
+ },
275
+ } as any,
276
+ false,
277
+ false
278
+ );
279
+
280
+ expect(navBarVisible).toBe(false);
281
+ });
282
+ });
283
+
284
+ it("returns false if the screen's general settings allow screen presentation", () => {
285
+ const navBarVisible = isNavBarVisible(
286
+ "",
287
+ {
288
+ general: {
289
+ allow_screen_plugin_presentation: true,
290
+ },
291
+ } as any,
292
+ false,
293
+ false
199
294
  );
200
295
 
201
- expect(result.current.screenData.targetScreen.id).toEqual(
202
- rivers["river-player"].id
296
+ expect(navBarVisible).toBe(false);
297
+ });
298
+
299
+ it("returns false if the screen's general settings hide app nav bar", () => {
300
+ const navBarVisible = isNavBarVisible(
301
+ "",
302
+ {
303
+ general: {
304
+ hide_app_nav_bar: true,
305
+ },
306
+ } as any,
307
+ false,
308
+ false
203
309
  );
310
+
311
+ expect(navBarVisible).toBe(false);
204
312
  });
205
- });
206
313
 
207
- describe("Modal components", () => {
208
- it("should return a correct pathname", () => {
209
- const { result } = renderHook(() => useRoute(), {
210
- wrapper: modalWrapper,
211
- });
314
+ it("returns false if it's secondary nav bar and hide_secondary_level_menu is true", () => {
315
+ const navBarVisible = isNavBarVisible(
316
+ "",
317
+ {
318
+ navigations: [
319
+ {
320
+ styles: {
321
+ hide_secondary_level_menu: true,
322
+ },
323
+ },
324
+ ],
325
+ } as any,
326
+ false,
327
+ true
328
+ );
212
329
 
213
- expect(result.current.pathname).toEqual(modalPathname);
330
+ expect(navBarVisible).toBe(false);
214
331
  });
215
332
 
216
- it("should return correct screenData information", () => {
217
- const { result } = renderHook(() => useRoute(), {
218
- wrapper: modalWrapper,
219
- });
333
+ it("returns true if it's secondary nav bar and hide_secondary_level_menu is false", () => {
334
+ const navBarVisible = isNavBarVisible(
335
+ "",
336
+ {
337
+ navigations: [
338
+ {
339
+ styles: {
340
+ hide_secondary_level_menu: false,
341
+ },
342
+ },
343
+ ],
344
+ } as any,
345
+ true,
346
+ false
347
+ );
348
+
349
+ expect(navBarVisible).toBe(true);
350
+ });
351
+
352
+ it("returns true if it's first level menu and hide_secondary_level_menu is true", () => {
353
+ const navBarVisible = isNavBarVisible(
354
+ "",
355
+ {
356
+ navigations: [
357
+ {
358
+ styles: {
359
+ hide_secondary_level_menu: true,
360
+ },
361
+ },
362
+ ],
363
+ } as any,
364
+ true,
365
+ false
366
+ );
220
367
 
221
- expect(result.current.screenData.id).toEqual(
222
- modalNavigator.modalState.screen.id
368
+ expect(navBarVisible).toBe(true);
369
+ });
370
+
371
+ it("returns true otherwise", () => {
372
+ const navBarVisible = isNavBarVisible(
373
+ "",
374
+ { navigations: [] } as any,
375
+ true,
376
+ true
223
377
  );
378
+
379
+ expect(navBarVisible).toBe(true);
224
380
  });
225
381
  });
226
382
  });