@applicaster/zapp-react-native-utils 12.0.0-rc.8 → 12.0.0-rc.80

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