@applicaster/zapp-react-native-utils 14.0.0-alpha.1308901965 → 14.0.0-alpha.1310732876

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 (64) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +0 -1
  2. package/actionsExecutor/ScreenActions.ts +20 -19
  3. package/analyticsUtils/AnalyticsEvents/sendHeaderClickEvent.ts +1 -1
  4. package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -1
  5. package/analyticsUtils/__tests__/analyticsUtils.test.js +0 -11
  6. package/analyticsUtils/index.tsx +3 -4
  7. package/analyticsUtils/manager.ts +1 -1
  8. package/appUtils/HooksManager/Hook.ts +4 -4
  9. package/appUtils/HooksManager/index.ts +11 -1
  10. package/appUtils/accessibilityManager/index.ts +3 -3
  11. package/appUtils/contextKeysManager/contextResolver.ts +29 -1
  12. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +5 -0
  13. package/appUtils/focusManager/__tests__/focusManager.test.js +1 -1
  14. package/appUtils/focusManager/index.ios.ts +10 -0
  15. package/appUtils/focusManager/index.ts +82 -11
  16. package/appUtils/focusManager/treeDataStructure/Tree/index.js +1 -1
  17. package/appUtils/focusManagerAux/utils/index.ts +106 -3
  18. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +0 -15
  19. package/appUtils/playerManager/useChapterMarker.tsx +0 -1
  20. package/appUtils/playerManager/usePlayerControllerSetup.tsx +16 -0
  21. package/arrayUtils/index.ts +1 -1
  22. package/componentsUtils/__tests__/isTabsScreen.test.ts +38 -0
  23. package/componentsUtils/index.ts +4 -1
  24. package/configurationUtils/__tests__/manifestKeyParser.test.ts +546 -0
  25. package/configurationUtils/manifestKeyParser.ts +57 -32
  26. package/index.d.ts +0 -9
  27. package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
  28. package/navigationUtils/index.ts +6 -4
  29. package/package.json +2 -3
  30. package/playerUtils/index.ts +51 -0
  31. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +15 -14
  32. package/reactHooks/cell-click/__tests__/index.test.js +3 -0
  33. package/reactHooks/debugging/__tests__/index.test.js +0 -1
  34. package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +47 -90
  35. package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +57 -37
  36. package/reactHooks/feed/index.ts +2 -0
  37. package/reactHooks/feed/useBatchLoading.ts +15 -8
  38. package/reactHooks/feed/useFeedLoader.tsx +39 -44
  39. package/reactHooks/feed/useLoadPipesDataDispatch.ts +57 -0
  40. package/reactHooks/feed/usePipesCacheReset.ts +2 -2
  41. package/reactHooks/flatList/useSequentialRenderItem.tsx +3 -3
  42. package/reactHooks/layout/__tests__/index.test.tsx +3 -1
  43. package/reactHooks/layout/isTablet/index.ts +12 -5
  44. package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +34 -36
  45. package/reactHooks/layout/useDimensions/useDimensions.ts +2 -3
  46. package/reactHooks/layout/useLayoutVersion.ts +5 -5
  47. package/reactHooks/navigation/index.ts +7 -5
  48. package/reactHooks/navigation/useScreenStateStore.ts +3 -6
  49. package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
  50. package/reactHooks/state/index.ts +1 -1
  51. package/reactHooks/state/useHomeRiver.ts +4 -2
  52. package/reactHooks/state/useRivers.ts +7 -8
  53. package/screenPickerUtils/index.ts +7 -0
  54. package/storage/ScreenSingleValueProvider.ts +25 -22
  55. package/storage/ScreenStateMultiSelectProvider.ts +26 -23
  56. package/testUtils/index.tsx +7 -8
  57. package/time/BackgroundTimer.ts +1 -1
  58. package/utils/__tests__/find.test.ts +36 -0
  59. package/utils/__tests__/pathOr.test.ts +37 -0
  60. package/utils/__tests__/startsWith.test.ts +30 -0
  61. package/utils/find.ts +3 -0
  62. package/utils/index.ts +8 -0
  63. package/utils/pathOr.ts +5 -0
  64. package/utils/startsWith.ts +9 -0
@@ -0,0 +1,130 @@
1
+ import { mapContentTypesToRivers } from "../index";
2
+
3
+ describe("mapContentTypesToRivers", () => {
4
+ it("should return the correct content types mapped to rivers", () => {
5
+ const state = {
6
+ rivers: {
7
+ "river-1": {
8
+ plugin_type: "river",
9
+ },
10
+ },
11
+ contentTypes: {
12
+ "content-type-1": {
13
+ screen_id: "river-1",
14
+ },
15
+ },
16
+ };
17
+
18
+ const result = mapContentTypesToRivers(state);
19
+
20
+ expect(result).toEqual({
21
+ "content-type-1": {
22
+ screenType: "river",
23
+ screen_id: "river-1",
24
+ },
25
+ });
26
+ });
27
+
28
+ it("should return null if contentTypes is undefined", () => {
29
+ const state = {
30
+ rivers: {
31
+ "river-1": {
32
+ plugin_type: "river",
33
+ },
34
+ },
35
+ // contentTypes is missing
36
+ };
37
+
38
+ const result = mapContentTypesToRivers(state);
39
+
40
+ expect(result).toBeNull();
41
+ });
42
+
43
+ it("should skip content types whose screen does not exist in rivers", () => {
44
+ const state = {
45
+ rivers: {
46
+ "river-1": {
47
+ plugin_type: "river",
48
+ },
49
+ },
50
+ contentTypes: {
51
+ "content-type-1": {
52
+ screen_id: "river-1",
53
+ },
54
+ "content-type-2": {
55
+ screen_id: "river-2", // river-2 does not exist
56
+ },
57
+ },
58
+ };
59
+
60
+ const result = mapContentTypesToRivers(state);
61
+
62
+ expect(result).toEqual({
63
+ "content-type-1": {
64
+ screenType: "river",
65
+ screen_id: "river-1",
66
+ },
67
+ });
68
+
69
+ // result is not null, but may be undefined for missing keys
70
+ expect(result && result["content-type-2"]).toBeUndefined();
71
+ });
72
+
73
+ it("should use 'type' if 'plugin_type' is not present in river", () => {
74
+ const state = {
75
+ rivers: {
76
+ "river-1": {
77
+ type: "custom-type",
78
+ },
79
+ },
80
+ contentTypes: {
81
+ "content-type-1": {
82
+ screen_id: "river-1",
83
+ },
84
+ },
85
+ };
86
+
87
+ const result = mapContentTypesToRivers(state);
88
+
89
+ expect(result).toEqual({
90
+ "content-type-1": {
91
+ screenType: "custom-type",
92
+ screen_id: "river-1",
93
+ },
94
+ });
95
+ });
96
+
97
+ it("should skip content types if neither plugin_type nor type is present in river", () => {
98
+ const state = {
99
+ rivers: {
100
+ "river-1": {
101
+ // no plugin_type or type
102
+ },
103
+ },
104
+ contentTypes: {
105
+ "content-type-1": {
106
+ screen_id: "river-1",
107
+ },
108
+ },
109
+ };
110
+
111
+ const result = mapContentTypesToRivers(state);
112
+
113
+ expect(result).toEqual({});
114
+ });
115
+
116
+ it("should handle empty contentTypes object", () => {
117
+ const state = {
118
+ rivers: {
119
+ "river-1": {
120
+ plugin_type: "river",
121
+ },
122
+ },
123
+ contentTypes: {},
124
+ };
125
+
126
+ const result = mapContentTypesToRivers(state);
127
+
128
+ expect(result).toEqual({});
129
+ });
130
+ });
@@ -13,6 +13,7 @@ import {
13
13
  isPlayable,
14
14
  isV2River,
15
15
  } from "./itemTypeMatchers";
16
+ import { RootState } from "@applicaster/zapp-react-native-redux/store";
16
17
 
17
18
  type PathAttribute = {
18
19
  screenType: string;
@@ -377,10 +378,11 @@ export const usesVideoModal = (
377
378
  return targetScreenConfiguration?.styles?.use_video_modal;
378
379
  };
379
380
 
380
- export const mapContentTypesToRivers = ({
381
- rivers,
382
- contentTypes,
383
- }): ZappContentTypesMapped | null => {
381
+ export const mapContentTypesToRivers = (
382
+ state: Partial<RootState>
383
+ ): ZappContentTypesMapped | null => {
384
+ const { rivers, contentTypes } = state;
385
+
384
386
  if (!contentTypes) {
385
387
  return null;
386
388
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "14.0.0-alpha.1308901965",
3
+ "version": "14.0.0-alpha.1310732876",
4
4
  "description": "Applicaster Zapp React Native utilities package",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "homepage": "https://github.com/applicaster/quickbrick#readme",
29
29
  "dependencies": {
30
- "@applicaster/applicaster-types": "14.0.0-alpha.1308901965",
30
+ "@applicaster/applicaster-types": "14.0.0-alpha.1310732876",
31
31
  "buffer": "^5.2.1",
32
32
  "camelize": "^1.0.0",
33
33
  "dayjs": "^1.11.10",
@@ -38,7 +38,6 @@
38
38
  "peerDependencies": {
39
39
  "@applicaster/zapp-pipes-v2-client": "*",
40
40
  "@react-native-community/netinfo": "*",
41
- "immer": "*",
42
41
  "react": "*",
43
42
  "react-native": "*",
44
43
  "uglify-js": "*",
@@ -5,6 +5,7 @@ import { isFilledArray } from "@applicaster/zapp-react-native-utils/arrayUtils";
5
5
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
6
6
 
7
7
  import { getBoolFromConfigValue } from "../configurationUtils";
8
+ import { Dimensions } from "react-native";
8
9
 
9
10
  export { getPlayerActionButtons } from "./getPlayerActionButtons";
10
11
 
@@ -97,3 +98,53 @@ export const isAudioItem = (item: Option<ZappEntry>) => {
97
98
  export const isInlineTV = (screenData) => {
98
99
  return isTV() && isFilledArray(screenData?.ui_components);
99
100
  };
101
+
102
+ const isPercentage = (value: string | number): boolean => {
103
+ if (typeof value === "string") {
104
+ return value.includes("%");
105
+ }
106
+
107
+ return false;
108
+ };
109
+
110
+ const getPercentageOf = (percent: string, value: number) => {
111
+ const percentageValue = parseFloat(percent.replace("%", ""));
112
+
113
+ if (isNaN(percentageValue)) {
114
+ return value;
115
+ }
116
+
117
+ return (value * percentageValue) / 100;
118
+ };
119
+
120
+ type DimensionsT = {
121
+ width: number | string;
122
+ height: number | string | undefined;
123
+ aspectRatio?: number;
124
+ };
125
+
126
+ export const getTabletWidth = (
127
+ tablet_landscape_sidebar_width,
128
+ dimensions: DimensionsT
129
+ ) => {
130
+ const { width: SCREEN_WIDTH } = Dimensions.get("screen");
131
+
132
+ const { width } = dimensions;
133
+ let widthValue = Number(width);
134
+
135
+ if (isPercentage(width)) {
136
+ widthValue = getPercentageOf(width.toString(), SCREEN_WIDTH);
137
+ }
138
+
139
+ const sidebarWidth = Number(tablet_landscape_sidebar_width?.replace("%", ""));
140
+
141
+ if (tablet_landscape_sidebar_width?.includes("%")) {
142
+ return widthValue * (1 - sidebarWidth / 100);
143
+ }
144
+
145
+ if (Number.isNaN(sidebarWidth)) {
146
+ return widthValue * 0.65;
147
+ }
148
+
149
+ return widthValue - sidebarWidth;
150
+ };
@@ -1,27 +1,31 @@
1
1
  import React from "react";
2
2
 
3
- import { act, renderHook } from "@testing-library/react-hooks";
3
+ import { renderHook } from "@testing-library/react-hooks";
4
+ import { act, waitFor } from "@testing-library/react-native";
4
5
  import { Provider } from "react-redux";
5
6
  import configureStore from "redux-mock-store";
7
+ import { useTrackedView } from "../useTrackedView";
6
8
 
7
9
  const mockUpdateComponentsPositions = jest.fn();
8
10
 
9
11
  jest.mock(
10
12
  "@applicaster/zapp-react-native-ui-components/Contexts/ScreenTrackedViewPositionsContext",
11
13
  () => ({
12
- useScreenTrackedViewPositionsContext: jest.fn().mockReturnValue({
14
+ useScreenTrackedViewPositionsContext: jest.fn(() => ({
13
15
  updateComponentsPositions: mockUpdateComponentsPositions,
14
16
  value: {
15
17
  "123": { componentId: "123", centerX: 0.4, centerY: 0.5 },
16
18
  "124": { componentId: "124", centerX: 0.2, centerY: 0.3 },
17
19
  },
18
- }),
20
+ })),
19
21
  })
20
22
  );
21
23
 
22
- jest.useFakeTimers({ legacyFakeTimers: true });
24
+ jest.useFakeTimers();
23
25
 
24
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation");
26
+ jest.mock(
27
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation"
28
+ );
25
29
 
26
30
  const mockStore = configureStore();
27
31
 
@@ -32,10 +36,8 @@ const Wrapper = ({ children }: { children: React.ReactChild }) => (
32
36
  <Provider store={store}>{children}</Provider>
33
37
  );
34
38
 
35
- const { useTrackedView } = require("../useTrackedView");
36
-
37
39
  describe("useTrackCurrentAutoScrollingElement", () => {
38
- it("should update position for selected component - onViewportEnter", () => {
40
+ it("should update position for selected component - onViewportEnter", async () => {
39
41
  const { result } = renderHook(() => useTrackedView("123"), {
40
42
  wrapper: Wrapper,
41
43
  });
@@ -46,14 +48,13 @@ describe("useTrackCurrentAutoScrollingElement", () => {
46
48
  rect: { left: 1, right: 1, top: 1, bottom: 1 },
47
49
  };
48
50
 
49
- act(async () => {
50
- await result.current.onPositionUpdated(mockRect);
51
+ act(() => {
52
+ result.current.onPositionUpdated(mockRect);
51
53
  });
52
54
 
53
- // Fast-forward until all timers have been executed
54
- jest.runAllTimers();
55
-
56
- expect(result.current.inViewPort).toBe(true);
55
+ await waitFor(() => {
56
+ expect(result.current.inViewPort).toBe(true);
57
+ });
57
58
 
58
59
  expect(mockUpdateComponentsPositions).toHaveBeenCalledWith(
59
60
  "123",
@@ -26,6 +26,9 @@ jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils/", () => ({
26
26
  }));
27
27
 
28
28
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
29
+ ...jest.requireActual(
30
+ "@applicaster/zapp-react-native-utils/reactHooks/screen"
31
+ ),
29
32
  useTargetScreenData: jest.fn(() => ({})),
30
33
  useCurrentScreenData: jest.fn(() => ({})),
31
34
  }));
@@ -12,7 +12,6 @@ describe("Debug utils", () => {
12
12
  // Clear the timers object
13
13
  Object.keys(timers).forEach((key) => delete timers[key]);
14
14
 
15
- // Mock performance.now()
16
15
  // eslint-disable-next-line no-undef
17
16
  performanceNowMock = jest.spyOn(performance, "now");
18
17
  performanceNowMock.mockReturnValue(0); // Initial value
@@ -1,29 +1,33 @@
1
1
  import { renderHook } from "@testing-library/react-hooks";
2
- import * as reduxMockStore from "redux-mock-store";
3
- import thunk from "redux-thunk";
4
- import React from "react";
5
- import * as ReactRedux from "react-redux";
2
+ import { allFeedsIsReady, useBatchLoading } from "../useBatchLoading";
3
+ import { WrappedWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
4
+ import { appStore } from "@applicaster/zapp-react-native-redux/AppStore";
5
+ import { waitFor } from "@testing-library/react-native";
6
6
 
7
7
  jest.mock("../../navigation");
8
8
 
9
9
  jest.mock(
10
10
  "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext",
11
11
  () => ({
12
+ ...jest.requireActual(
13
+ "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext"
14
+ ),
12
15
  useScreenContext: jest.fn().mockReturnValue({ screen: {}, entry: {} }),
13
16
  })
14
17
  );
15
18
 
16
- const useBatchLoading = require("../useBatchLoading").useBatchLoading;
17
- const allFeedsIsReady = require("../useBatchLoading").allFeedsIsReady;
18
-
19
- const mockStore = reduxMockStore.default([thunk]);
20
-
21
- const wrapper: React.FC<any> = ({ children, store }) => (
22
- <ReactRedux.Provider store={store}>{children}</ReactRedux.Provider>
23
- );
19
+ const wrapper = WrappedWithProviders;
24
20
 
25
21
  describe("useBatchLoading", () => {
26
- const useDispatchSpy = jest.spyOn(ReactRedux, "useDispatch");
22
+ const data = [
23
+ { data: { source: "url1" }, component_type: "any" },
24
+ { data: { source: "url2" }, component_type: "any" },
25
+ { data: { source: "url3" }, component_type: "any" },
26
+ { data: { source: "url4" }, component_type: "any" },
27
+ { data: { source: "url5" }, component_type: "any" },
28
+ { data: { source: "url6" }, component_type: "any" },
29
+ // ... more items
30
+ ];
27
31
 
28
32
  beforeAll(() => {
29
33
  jest.useFakeTimers();
@@ -33,8 +37,8 @@ describe("useBatchLoading", () => {
33
37
  jest.clearAllMocks();
34
38
  });
35
39
 
36
- it("loadPipesData start loading not started requests", () => {
37
- const store = mockStore({
40
+ it("loadPipesData start loading not started requests", async () => {
41
+ const store = {
38
42
  zappPipes: {
39
43
  url1: {
40
44
  loading: true,
@@ -53,31 +57,21 @@ describe("useBatchLoading", () => {
53
57
  },
54
58
  },
55
59
  test: "true",
56
- });
57
-
58
- useDispatchSpy.mockReturnValue(store.dispatch);
60
+ };
59
61
 
60
62
  const initialBatchSize = 3;
61
63
  const riverId = "123";
62
64
 
63
- const data = [
64
- { data: { source: "url1" } },
65
- { data: { source: "url2" } },
66
- { data: { source: "url3" } },
67
- { data: { source: "url4" } },
68
- { data: { source: "url5" } },
69
- { data: { source: "url6" } },
70
- // ... more items
71
- ];
72
-
73
65
  renderHook(() => useBatchLoading(data, { initialBatchSize, riverId }), {
74
66
  wrapper,
75
67
  initialProps: { store },
76
68
  });
77
69
 
78
- const actions = store.getActions();
70
+ const actions = (appStore.getStore() as any).getActions();
79
71
 
80
- expect(actions).toHaveLength(2);
72
+ await waitFor(() => {
73
+ expect(actions).toHaveLength(2);
74
+ });
81
75
 
82
76
  expect(actions[0]).toMatchObject({
83
77
  type: "ZAPP_PIPES_REQUEST_START",
@@ -91,7 +85,7 @@ describe("useBatchLoading", () => {
91
85
  });
92
86
 
93
87
  it("loadPipesData start loading new feed when 1 feed is done loading and 1 is in loading state", () => {
94
- const store = mockStore({
88
+ const store = {
95
89
  zappPipes: {
96
90
  url1: {
97
91
  loading: false,
@@ -110,31 +104,17 @@ describe("useBatchLoading", () => {
110
104
  },
111
105
  },
112
106
  test: "true",
113
- });
114
-
115
- useDispatchSpy.mockReturnValue(store.dispatch);
107
+ };
116
108
 
117
109
  const initialBatchSize = 3;
118
110
  const riverId = "123";
119
111
 
120
- const data = [
121
- { data: { source: "url1" } },
122
- { data: { source: "url2" } },
123
- { data: { source: "url3" } },
124
- { data: { source: "url4" } },
125
- { data: { source: "url5" } },
126
- { data: { source: "url6" } },
127
- // ... more items
128
- ];
129
-
130
- expect(useDispatchSpy).toBeCalledTimes(0);
131
-
132
112
  renderHook(() => useBatchLoading(data, { initialBatchSize, riverId }), {
133
113
  wrapper,
134
114
  initialProps: { store },
135
115
  });
136
116
 
137
- const actions = store.getActions();
117
+ const actions = (appStore.getStore() as any).getActions();
138
118
 
139
119
  expect(actions).toHaveLength(1);
140
120
 
@@ -145,38 +125,26 @@ describe("useBatchLoading", () => {
145
125
  });
146
126
 
147
127
  it("loadPipesData has been called when no data cached", () => {
148
- const store = mockStore({
128
+ const store = {
149
129
  zappPipes: {},
150
130
  test: "true",
151
- });
152
-
153
- useDispatchSpy.mockReturnValue(store.dispatch);
131
+ };
154
132
 
155
133
  const initialBatchSize = 3;
156
134
  const riverId = "123";
157
135
 
158
- const data = [
159
- { data: { source: "url1" } },
160
- { data: { source: "url2" } },
161
- { data: { source: "url3" } },
162
- { data: { source: "url4" } },
163
- { data: { source: "url5" } },
164
- { data: { source: "url6" } },
165
- // ... more items
166
- ];
167
-
168
136
  renderHook(() => useBatchLoading(data, { initialBatchSize, riverId }), {
169
137
  wrapper,
170
138
  initialProps: { store },
171
139
  });
172
140
 
173
- const actions = store.getActions();
141
+ const actions = (appStore.getStore() as any).getActions();
174
142
 
175
143
  expect(actions).toHaveLength(3);
176
144
  });
177
145
 
178
146
  it("initial batch ready when all initial items loaded", () => {
179
- const store = mockStore({
147
+ const store = {
180
148
  zappPipes: {
181
149
  url1: {
182
150
  loading: false,
@@ -194,19 +162,11 @@ describe("useBatchLoading", () => {
194
162
  data: {},
195
163
  },
196
164
  },
197
- });
198
-
199
- useDispatchSpy.mockReturnValue(store.dispatch);
165
+ };
200
166
 
201
167
  const initialBatchSize = 3;
202
168
  const riverId = "123";
203
169
 
204
- const data: Partial<ZappUIComponent>[] = [
205
- { data: { source: "url1" } },
206
- { data: { source: "url2" } },
207
- { data: { source: "url3" } },
208
- ];
209
-
210
170
  const { result } = renderHook(
211
171
  () => useBatchLoading(data, { initialBatchSize, riverId }),
212
172
  { wrapper, initialProps: { store } }
@@ -216,12 +176,10 @@ describe("useBatchLoading", () => {
216
176
  });
217
177
 
218
178
  it("gallery-qb: loadPipesData should be called only once for first component in the gallery", () => {
219
- const store = mockStore({
179
+ const store = {
220
180
  zappPipes: {},
221
181
  test: "true",
222
- });
223
-
224
- useDispatchSpy.mockReturnValue(store.dispatch);
182
+ };
225
183
 
226
184
  const initialBatchSize = 3;
227
185
  const riverId = "123";
@@ -231,11 +189,11 @@ describe("useBatchLoading", () => {
231
189
  component_type: "gallery-qb",
232
190
  ui_components: [{ data: { source: "url1" } }],
233
191
  },
234
- { data: { source: "url2" } },
235
- { data: { source: "url3" } },
236
- { data: { source: "url4" } },
237
- { data: { source: "url5" } },
238
- { data: { source: "url6" } },
192
+ { data: { source: "url2" }, component_type: "any" },
193
+ { data: { source: "url3" }, component_type: "any" },
194
+ { data: { source: "url4" }, component_type: "any" },
195
+ { data: { source: "url5" }, component_type: "any" },
196
+ { data: { source: "url6" }, component_type: "any" },
239
197
  // ... more items
240
198
  ];
241
199
 
@@ -244,13 +202,13 @@ describe("useBatchLoading", () => {
244
202
  initialProps: { store },
245
203
  });
246
204
 
247
- const actions = store.getActions();
205
+ const actions = (appStore.getStore() as any).getActions();
248
206
 
249
207
  expect(actions).toHaveLength(1);
250
208
  });
251
209
 
252
210
  it("gallery-qb: initial batch ready when all initial items loaded", () => {
253
- const store = mockStore({
211
+ const store = {
254
212
  zappPipes: {
255
213
  url1: {
256
214
  loading: false,
@@ -258,20 +216,19 @@ describe("useBatchLoading", () => {
258
216
  data: {},
259
217
  },
260
218
  },
261
- });
262
-
263
- useDispatchSpy.mockReturnValue(store.dispatch);
219
+ };
264
220
 
265
221
  const initialBatchSize = 3;
266
222
  const riverId = "123";
267
223
 
268
- const data: Partial<ZappUIComponent>[] = [
224
+ const data = [
269
225
  {
270
226
  component_type: "gallery-qb",
271
- ui_components: [{ data: { source: "url1" } }],
227
+ data: {},
228
+ ui_components: [{ data: { source: "url1" } }] as any,
272
229
  },
273
- { data: { source: "url2" } },
274
- { data: { source: "url3" } },
230
+ { data: { source: "url2" }, component_type: "any" },
231
+ { data: { source: "url3" }, component_type: "any" },
275
232
  ];
276
233
 
277
234
  const { result } = renderHook(