@applicaster/zapp-react-native-utils 14.0.0-alpha.7900711229 → 14.0.0-alpha.8220111512
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.
- package/actionsExecutor/ActionExecutorContext.tsx +83 -60
- package/analyticsUtils/AnalyticsEvents/helper.ts +81 -0
- package/analyticsUtils/AnalyticsEvents/sendHeaderClickEvent.ts +1 -1
- package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -1
- package/analyticsUtils/AnalyticsEvents/sendOnClickEvent.ts +14 -4
- package/analyticsUtils/__tests__/analyticsUtils.test.js +14 -0
- package/analyticsUtils/events.ts +8 -0
- package/analyticsUtils/index.tsx +3 -4
- package/analyticsUtils/manager.ts +1 -1
- package/appUtils/HooksManager/Hook.ts +4 -4
- package/appUtils/HooksManager/index.ts +11 -1
- package/appUtils/accessibilityManager/index.ts +5 -5
- package/appUtils/contextKeysManager/contextResolver.ts +1 -14
- package/appUtils/focusManager/treeDataStructure/Tree/index.js +1 -1
- package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +0 -15
- package/appUtils/playerManager/useChapterMarker.tsx +0 -1
- package/appUtils/playerManager/usePlayerControllerSetup.tsx +16 -0
- package/arrayUtils/index.ts +1 -1
- package/componentsUtils/__tests__/isTabsScreen.test.ts +38 -0
- package/componentsUtils/index.ts +4 -1
- package/configurationUtils/__tests__/manifestKeyParser.test.ts +547 -0
- package/configurationUtils/manifestKeyParser.ts +57 -32
- package/focusManager/FocusManager.ts +26 -16
- package/focusManager/Tree.ts +25 -21
- package/focusManager/__tests__/FocusManager.test.ts +50 -8
- package/index.d.ts +0 -9
- package/manifestUtils/defaultManifestConfigurations/player.js +8 -0
- package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
- package/navigationUtils/index.ts +6 -4
- package/package.json +2 -3
- package/playerUtils/getPlayerActionButtons.ts +1 -1
- package/playerUtils/index.ts +51 -0
- package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +15 -14
- package/reactHooks/cell-click/index.ts +1 -8
- package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +39 -88
- package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +0 -20
- package/reactHooks/feed/useBatchLoading.ts +9 -7
- package/reactHooks/feed/useFeedLoader.tsx +14 -17
- package/reactHooks/feed/usePipesCacheReset.ts +3 -3
- package/reactHooks/flatList/useSequentialRenderItem.tsx +3 -3
- package/reactHooks/layout/__tests__/index.test.tsx +3 -1
- package/reactHooks/layout/isTablet/index.ts +12 -5
- package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +34 -36
- package/reactHooks/layout/useDimensions/useDimensions.ts +2 -3
- package/reactHooks/layout/useLayoutVersion.ts +5 -5
- package/reactHooks/navigation/index.ts +7 -5
- package/reactHooks/navigation/useIsScreenActive.ts +9 -5
- package/reactHooks/navigation/useRoute.ts +2 -7
- package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
- package/reactHooks/screen/useScreenContext.ts +1 -1
- package/reactHooks/state/__tests__/ZStoreProvider.test.tsx +2 -1
- package/reactHooks/state/useRivers.ts +7 -8
- package/riverComponetsMeasurementProvider/index.tsx +1 -1
- package/services/js2native.ts +1 -0
- package/testUtils/index.tsx +7 -8
- package/time/BackgroundTimer.ts +6 -4
- package/utils/index.ts +5 -0
- package/actionsExecutor/ScreenActions.ts +0 -163
- package/actionsExecutor/StorageActions.ts +0 -110
- package/actionsExecutor/feedDecorator.ts +0 -171
- package/actionsExecutor/screenResolver.ts +0 -11
- package/reactHooks/navigation/useScreenStateStore.ts +0 -11
- package/storage/ScreenSingleValueProvider.ts +0 -197
- package/storage/ScreenStateMultiSelectProvider.ts +0 -282
- package/storage/StorageMultiSelectProvider.ts +0 -192
- package/storage/StorageSingleSelectProvider.ts +0 -108
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import {
|
|
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()
|
|
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(
|
|
24
|
+
jest.useFakeTimers();
|
|
23
25
|
|
|
24
|
-
jest.mock(
|
|
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(
|
|
50
|
-
|
|
51
|
+
act(() => {
|
|
52
|
+
result.current.onPositionUpdated(mockRect);
|
|
51
53
|
});
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
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",
|
|
@@ -16,8 +16,7 @@ import { ActionExecutorContext } from "@applicaster/zapp-react-native-utils/acti
|
|
|
16
16
|
import { isFunction, noop } from "../../functionUtils";
|
|
17
17
|
import { useSendAnalyticsOnPress } from "../analytics";
|
|
18
18
|
import { logOnPress, warnEmptyContentType } from "./helpers";
|
|
19
|
-
import { useCurrentScreenData
|
|
20
|
-
import { useScreenStateStore } from "../navigation/useScreenStateStore";
|
|
19
|
+
import { useCurrentScreenData } from "../screen";
|
|
21
20
|
|
|
22
21
|
/**
|
|
23
22
|
* If onCellTap is defined execute the function and
|
|
@@ -43,12 +42,10 @@ export const useCellClick = ({
|
|
|
43
42
|
}: Props): onPressReturnFn => {
|
|
44
43
|
const { push, currentRoute } = useNavigation();
|
|
45
44
|
const { pathname } = useRoute();
|
|
46
|
-
const screenStateStore = useScreenStateStore();
|
|
47
45
|
|
|
48
46
|
const onCellTap: Option<Function> = React.useContext(CellTapContext);
|
|
49
47
|
const actionExecutor = React.useContext(ActionExecutorContext);
|
|
50
48
|
const screenData = useCurrentScreenData();
|
|
51
|
-
const screenState = useScreenContext()?.options;
|
|
52
49
|
|
|
53
50
|
const cellSelectable = toBooleanWithDefaultTrue(
|
|
54
51
|
component?.rules?.component_cells_selectable
|
|
@@ -86,9 +83,6 @@ export const useCellClick = ({
|
|
|
86
83
|
await actionExecutor?.handleEntryActions(selectedItem, {
|
|
87
84
|
component,
|
|
88
85
|
screenData,
|
|
89
|
-
screenState,
|
|
90
|
-
screenRoute: pathname,
|
|
91
|
-
screenStateStore,
|
|
92
86
|
});
|
|
93
87
|
}
|
|
94
88
|
|
|
@@ -123,7 +117,6 @@ export const useCellClick = ({
|
|
|
123
117
|
push,
|
|
124
118
|
sendAnalyticsOnPress,
|
|
125
119
|
screenData,
|
|
126
|
-
screenState,
|
|
127
120
|
]
|
|
128
121
|
);
|
|
129
122
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { renderHook } from "@testing-library/react-hooks";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
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";
|
|
6
5
|
|
|
7
6
|
jest.mock("../../navigation");
|
|
8
7
|
|
|
@@ -13,17 +12,18 @@ jest.mock(
|
|
|
13
12
|
})
|
|
14
13
|
);
|
|
15
14
|
|
|
16
|
-
const
|
|
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
|
-
);
|
|
15
|
+
const wrapper = WrappedWithProviders;
|
|
24
16
|
|
|
25
17
|
describe("useBatchLoading", () => {
|
|
26
|
-
const
|
|
18
|
+
const data = [
|
|
19
|
+
{ data: { source: "url1" }, component_type: "any" },
|
|
20
|
+
{ data: { source: "url2" }, component_type: "any" },
|
|
21
|
+
{ data: { source: "url3" }, component_type: "any" },
|
|
22
|
+
{ data: { source: "url4" }, component_type: "any" },
|
|
23
|
+
{ data: { source: "url5" }, component_type: "any" },
|
|
24
|
+
{ data: { source: "url6" }, component_type: "any" },
|
|
25
|
+
// ... more items
|
|
26
|
+
];
|
|
27
27
|
|
|
28
28
|
beforeAll(() => {
|
|
29
29
|
jest.useFakeTimers();
|
|
@@ -34,7 +34,7 @@ describe("useBatchLoading", () => {
|
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
it("loadPipesData start loading not started requests", () => {
|
|
37
|
-
const store =
|
|
37
|
+
const store = {
|
|
38
38
|
zappPipes: {
|
|
39
39
|
url1: {
|
|
40
40
|
loading: true,
|
|
@@ -53,29 +53,17 @@ describe("useBatchLoading", () => {
|
|
|
53
53
|
},
|
|
54
54
|
},
|
|
55
55
|
test: "true",
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
useDispatchSpy.mockReturnValue(store.dispatch);
|
|
56
|
+
};
|
|
59
57
|
|
|
60
58
|
const initialBatchSize = 3;
|
|
61
59
|
const riverId = "123";
|
|
62
60
|
|
|
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
61
|
renderHook(() => useBatchLoading(data, { initialBatchSize, riverId }), {
|
|
74
62
|
wrapper,
|
|
75
63
|
initialProps: { store },
|
|
76
64
|
});
|
|
77
65
|
|
|
78
|
-
const actions =
|
|
66
|
+
const actions = (appStore.getStore() as any).getActions();
|
|
79
67
|
|
|
80
68
|
expect(actions).toHaveLength(2);
|
|
81
69
|
|
|
@@ -91,7 +79,7 @@ describe("useBatchLoading", () => {
|
|
|
91
79
|
});
|
|
92
80
|
|
|
93
81
|
it("loadPipesData start loading new feed when 1 feed is done loading and 1 is in loading state", () => {
|
|
94
|
-
const store =
|
|
82
|
+
const store = {
|
|
95
83
|
zappPipes: {
|
|
96
84
|
url1: {
|
|
97
85
|
loading: false,
|
|
@@ -110,31 +98,17 @@ describe("useBatchLoading", () => {
|
|
|
110
98
|
},
|
|
111
99
|
},
|
|
112
100
|
test: "true",
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
useDispatchSpy.mockReturnValue(store.dispatch);
|
|
101
|
+
};
|
|
116
102
|
|
|
117
103
|
const initialBatchSize = 3;
|
|
118
104
|
const riverId = "123";
|
|
119
105
|
|
|
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
106
|
renderHook(() => useBatchLoading(data, { initialBatchSize, riverId }), {
|
|
133
107
|
wrapper,
|
|
134
108
|
initialProps: { store },
|
|
135
109
|
});
|
|
136
110
|
|
|
137
|
-
const actions =
|
|
111
|
+
const actions = (appStore.getStore() as any).getActions();
|
|
138
112
|
|
|
139
113
|
expect(actions).toHaveLength(1);
|
|
140
114
|
|
|
@@ -145,38 +119,26 @@ describe("useBatchLoading", () => {
|
|
|
145
119
|
});
|
|
146
120
|
|
|
147
121
|
it("loadPipesData has been called when no data cached", () => {
|
|
148
|
-
const store =
|
|
122
|
+
const store = {
|
|
149
123
|
zappPipes: {},
|
|
150
124
|
test: "true",
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
useDispatchSpy.mockReturnValue(store.dispatch);
|
|
125
|
+
};
|
|
154
126
|
|
|
155
127
|
const initialBatchSize = 3;
|
|
156
128
|
const riverId = "123";
|
|
157
129
|
|
|
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
130
|
renderHook(() => useBatchLoading(data, { initialBatchSize, riverId }), {
|
|
169
131
|
wrapper,
|
|
170
132
|
initialProps: { store },
|
|
171
133
|
});
|
|
172
134
|
|
|
173
|
-
const actions =
|
|
135
|
+
const actions = (appStore.getStore() as any).getActions();
|
|
174
136
|
|
|
175
137
|
expect(actions).toHaveLength(3);
|
|
176
138
|
});
|
|
177
139
|
|
|
178
140
|
it("initial batch ready when all initial items loaded", () => {
|
|
179
|
-
const store =
|
|
141
|
+
const store = {
|
|
180
142
|
zappPipes: {
|
|
181
143
|
url1: {
|
|
182
144
|
loading: false,
|
|
@@ -194,19 +156,11 @@ describe("useBatchLoading", () => {
|
|
|
194
156
|
data: {},
|
|
195
157
|
},
|
|
196
158
|
},
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
useDispatchSpy.mockReturnValue(store.dispatch);
|
|
159
|
+
};
|
|
200
160
|
|
|
201
161
|
const initialBatchSize = 3;
|
|
202
162
|
const riverId = "123";
|
|
203
163
|
|
|
204
|
-
const data: Partial<ZappUIComponent>[] = [
|
|
205
|
-
{ data: { source: "url1" } },
|
|
206
|
-
{ data: { source: "url2" } },
|
|
207
|
-
{ data: { source: "url3" } },
|
|
208
|
-
];
|
|
209
|
-
|
|
210
164
|
const { result } = renderHook(
|
|
211
165
|
() => useBatchLoading(data, { initialBatchSize, riverId }),
|
|
212
166
|
{ wrapper, initialProps: { store } }
|
|
@@ -216,12 +170,10 @@ describe("useBatchLoading", () => {
|
|
|
216
170
|
});
|
|
217
171
|
|
|
218
172
|
it("gallery-qb: loadPipesData should be called only once for first component in the gallery", () => {
|
|
219
|
-
const store =
|
|
173
|
+
const store = {
|
|
220
174
|
zappPipes: {},
|
|
221
175
|
test: "true",
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
useDispatchSpy.mockReturnValue(store.dispatch);
|
|
176
|
+
};
|
|
225
177
|
|
|
226
178
|
const initialBatchSize = 3;
|
|
227
179
|
const riverId = "123";
|
|
@@ -231,11 +183,11 @@ describe("useBatchLoading", () => {
|
|
|
231
183
|
component_type: "gallery-qb",
|
|
232
184
|
ui_components: [{ data: { source: "url1" } }],
|
|
233
185
|
},
|
|
234
|
-
{ data: { source: "url2" } },
|
|
235
|
-
{ data: { source: "url3" } },
|
|
236
|
-
{ data: { source: "url4" } },
|
|
237
|
-
{ data: { source: "url5" } },
|
|
238
|
-
{ data: { source: "url6" } },
|
|
186
|
+
{ data: { source: "url2" }, component_type: "any" },
|
|
187
|
+
{ data: { source: "url3" }, component_type: "any" },
|
|
188
|
+
{ data: { source: "url4" }, component_type: "any" },
|
|
189
|
+
{ data: { source: "url5" }, component_type: "any" },
|
|
190
|
+
{ data: { source: "url6" }, component_type: "any" },
|
|
239
191
|
// ... more items
|
|
240
192
|
];
|
|
241
193
|
|
|
@@ -244,13 +196,13 @@ describe("useBatchLoading", () => {
|
|
|
244
196
|
initialProps: { store },
|
|
245
197
|
});
|
|
246
198
|
|
|
247
|
-
const actions =
|
|
199
|
+
const actions = (appStore.getStore() as any).getActions();
|
|
248
200
|
|
|
249
201
|
expect(actions).toHaveLength(1);
|
|
250
202
|
});
|
|
251
203
|
|
|
252
204
|
it("gallery-qb: initial batch ready when all initial items loaded", () => {
|
|
253
|
-
const store =
|
|
205
|
+
const store = {
|
|
254
206
|
zappPipes: {
|
|
255
207
|
url1: {
|
|
256
208
|
loading: false,
|
|
@@ -258,20 +210,19 @@ describe("useBatchLoading", () => {
|
|
|
258
210
|
data: {},
|
|
259
211
|
},
|
|
260
212
|
},
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
useDispatchSpy.mockReturnValue(store.dispatch);
|
|
213
|
+
};
|
|
264
214
|
|
|
265
215
|
const initialBatchSize = 3;
|
|
266
216
|
const riverId = "123";
|
|
267
217
|
|
|
268
|
-
const data
|
|
218
|
+
const data = [
|
|
269
219
|
{
|
|
270
220
|
component_type: "gallery-qb",
|
|
271
|
-
|
|
221
|
+
data: {},
|
|
222
|
+
ui_components: [{ data: { source: "url1" } }] as any,
|
|
272
223
|
},
|
|
273
|
-
{ data: { source: "url2" } },
|
|
274
|
-
{ data: { source: "url3" } },
|
|
224
|
+
{ data: { source: "url2" }, component_type: "any" },
|
|
225
|
+
{ data: { source: "url3" }, component_type: "any" },
|
|
275
226
|
];
|
|
276
227
|
|
|
277
228
|
const { result } = renderHook(
|
|
@@ -138,11 +138,6 @@ describe("useFeedLoader", () => {
|
|
|
138
138
|
expect(loadPipesDataSpy).toBeCalledWith(feedUrl, {
|
|
139
139
|
clearCache: true,
|
|
140
140
|
riverId: undefined,
|
|
141
|
-
resolvers: {
|
|
142
|
-
screen: {
|
|
143
|
-
screenStateStore: undefined,
|
|
144
|
-
},
|
|
145
|
-
},
|
|
146
141
|
});
|
|
147
142
|
|
|
148
143
|
const store2 = mockStore({
|
|
@@ -184,11 +179,6 @@ describe("useFeedLoader", () => {
|
|
|
184
179
|
expect(loadPipesDataSpy).toBeCalledWith(feedUrl, {
|
|
185
180
|
clearCache: true,
|
|
186
181
|
riverId: undefined,
|
|
187
|
-
resolvers: {
|
|
188
|
-
screen: {
|
|
189
|
-
screenStateStore: undefined,
|
|
190
|
-
},
|
|
191
|
-
},
|
|
192
182
|
});
|
|
193
183
|
|
|
194
184
|
const store2 = mockStore({
|
|
@@ -238,11 +228,6 @@ describe("useFeedLoader", () => {
|
|
|
238
228
|
expect(loadPipesDataSpy).toBeCalledWith(feedUrl, {
|
|
239
229
|
clearCache: true,
|
|
240
230
|
silentRefresh: true,
|
|
241
|
-
resolvers: {
|
|
242
|
-
screen: {
|
|
243
|
-
screenStateStore: undefined,
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
231
|
});
|
|
247
232
|
|
|
248
233
|
loadPipesDataSpy.mockRestore();
|
|
@@ -282,11 +267,6 @@ describe("useFeedLoader", () => {
|
|
|
282
267
|
expect(loadPipesDataSpy).toBeCalledWith(nextUrl, {
|
|
283
268
|
parentFeed: feedUrlWithNext,
|
|
284
269
|
silentRefresh: true,
|
|
285
|
-
resolvers: {
|
|
286
|
-
screen: {
|
|
287
|
-
screenStateStore: undefined,
|
|
288
|
-
},
|
|
289
|
-
},
|
|
290
270
|
});
|
|
291
271
|
|
|
292
272
|
loadPipesDataSpy.mockRestore();
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { complement, compose, isNil, map, min, prop, take, uniq } from "ramda";
|
|
2
|
-
import { useDispatch } from "react-redux";
|
|
3
2
|
import * as React from "react";
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import {
|
|
4
|
+
ZappPipes,
|
|
5
|
+
useAppDispatch,
|
|
6
|
+
useZappPipesFeed,
|
|
7
|
+
} from "@applicaster/zapp-react-native-redux";
|
|
6
8
|
import { isNilOrEmpty } from "../../reactUtils/helpers";
|
|
7
9
|
import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
|
|
8
10
|
import {
|
|
@@ -10,7 +12,7 @@ import {
|
|
|
10
12
|
getSearchContext,
|
|
11
13
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
14
|
import { isGallery } from "@applicaster/zapp-react-native-utils/componentsUtils";
|
|
13
|
-
import { useScreenContext } from "../screen
|
|
15
|
+
import { useScreenContext } from "../screen";
|
|
14
16
|
|
|
15
17
|
type Options = {
|
|
16
18
|
initialBatchSize?: number;
|
|
@@ -63,7 +65,7 @@ export const useBatchLoading = (
|
|
|
63
65
|
componentsToRender: { data?: ZappDataSource; component_type: string }[],
|
|
64
66
|
options: Options
|
|
65
67
|
) => {
|
|
66
|
-
const dispatch =
|
|
68
|
+
const dispatch = useAppDispatch();
|
|
67
69
|
const { screen: screenContext, entry: entryContext } = useScreenContext();
|
|
68
70
|
const [searchContext] = ZappPipesSearchContext.useZappPipesContext();
|
|
69
71
|
const [hasEverBeenReady, setHasEverBeenReady] = React.useState(false);
|
|
@@ -118,7 +120,7 @@ export const useBatchLoading = (
|
|
|
118
120
|
[]
|
|
119
121
|
);
|
|
120
122
|
|
|
121
|
-
const feeds =
|
|
123
|
+
const feeds = useZappPipesFeed(feedUrls);
|
|
122
124
|
|
|
123
125
|
// dispatch loadPipesData for each feed that is not loaded
|
|
124
126
|
const runBatchLoading = React.useCallback(() => {
|
|
@@ -139,7 +141,7 @@ export const useBatchLoading = (
|
|
|
139
141
|
if (mappedFeedUrl) {
|
|
140
142
|
// 4. load data
|
|
141
143
|
return dispatch(
|
|
142
|
-
loadPipesData(mappedFeedUrl, { riverId: options.riverId })
|
|
144
|
+
ZappPipes.loadPipesData(mappedFeedUrl, { riverId: options.riverId })
|
|
143
145
|
);
|
|
144
146
|
}
|
|
145
147
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import React, { useEffect } from "react";
|
|
2
|
-
import { useDispatch } from "react-redux";
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import {
|
|
4
|
+
ZappPipes,
|
|
5
|
+
useAppDispatch,
|
|
6
|
+
useZappPipesFeed,
|
|
7
|
+
} from "@applicaster/zapp-react-native-redux";
|
|
6
8
|
|
|
7
9
|
import { reactHooksLogger } from "../logger";
|
|
8
10
|
import { shouldDispatchData, useIsInitialRender } from "../utils";
|
|
9
11
|
import { useInflatedUrl } from "./useInflatedUrl";
|
|
10
12
|
import { useRoute } from "../navigation";
|
|
11
|
-
import { useScreenResolvers } from "@applicaster/zapp-react-native-utils/actionsExecutor/screenResolver";
|
|
12
13
|
|
|
13
14
|
const logger = reactHooksLogger.addSubsystem("useFeedLoader");
|
|
14
15
|
|
|
@@ -50,9 +51,8 @@ export const useFeedLoader = ({
|
|
|
50
51
|
}, []);
|
|
51
52
|
|
|
52
53
|
const isInitialRender = useIsInitialRender();
|
|
53
|
-
const dispatch =
|
|
54
|
+
const dispatch = useAppDispatch();
|
|
54
55
|
const { screenData } = useRoute();
|
|
55
|
-
const resolvers = useScreenResolvers();
|
|
56
56
|
|
|
57
57
|
const callableFeedUrl = useInflatedUrl({ feedUrl, mapping });
|
|
58
58
|
|
|
@@ -66,17 +66,16 @@ export const useFeedLoader = ({
|
|
|
66
66
|
(silentRefresh = true, callback) => {
|
|
67
67
|
if (callableFeedUrl) {
|
|
68
68
|
dispatch(
|
|
69
|
-
loadPipesData(callableFeedUrl, {
|
|
69
|
+
ZappPipes.loadPipesData(callableFeedUrl, {
|
|
70
70
|
clearCache: true,
|
|
71
71
|
silentRefresh,
|
|
72
72
|
callback,
|
|
73
73
|
riverId,
|
|
74
|
-
resolvers,
|
|
75
74
|
})
|
|
76
75
|
);
|
|
77
76
|
}
|
|
78
77
|
},
|
|
79
|
-
[callableFeedUrl
|
|
78
|
+
[callableFeedUrl]
|
|
80
79
|
);
|
|
81
80
|
|
|
82
81
|
const loadNext: FeedLoaderResponse["loadNext"] = React.useCallback(() => {
|
|
@@ -85,16 +84,15 @@ export const useFeedLoader = ({
|
|
|
85
84
|
|
|
86
85
|
if (nextFeed) {
|
|
87
86
|
dispatch(
|
|
88
|
-
loadPipesData(nextFeed, {
|
|
87
|
+
ZappPipes.loadPipesData(nextFeed, {
|
|
89
88
|
silentRefresh: true,
|
|
90
89
|
parentFeed: callableFeedUrl,
|
|
91
90
|
riverId,
|
|
92
|
-
resolvers,
|
|
93
91
|
})
|
|
94
92
|
);
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
|
-
}, [callableFeedUrl, currentFeed?.data?.next
|
|
95
|
+
}, [callableFeedUrl, currentFeed?.data?.next]);
|
|
98
96
|
|
|
99
97
|
useEffect(() => {
|
|
100
98
|
if (
|
|
@@ -102,11 +100,10 @@ export const useFeedLoader = ({
|
|
|
102
100
|
) {
|
|
103
101
|
if (callableFeedUrl && !pipesOptions.skipLoading) {
|
|
104
102
|
dispatch(
|
|
105
|
-
loadPipesData(callableFeedUrl, {
|
|
103
|
+
ZappPipes.loadPipesData(callableFeedUrl, {
|
|
106
104
|
...pipesOptions,
|
|
107
105
|
clearCache: true,
|
|
108
106
|
riverId,
|
|
109
|
-
resolvers,
|
|
110
107
|
})
|
|
111
108
|
);
|
|
112
109
|
} else if (!callableFeedUrl) {
|
|
@@ -131,16 +128,16 @@ export const useFeedLoader = ({
|
|
|
131
128
|
jsOnly: true,
|
|
132
129
|
});
|
|
133
130
|
}
|
|
134
|
-
}, [
|
|
131
|
+
}, []);
|
|
135
132
|
|
|
136
133
|
// Reload feed when feedUrl changes, unless skipLoading is true
|
|
137
134
|
useEffect(() => {
|
|
138
135
|
if (!isInitialRender && callableFeedUrl && !pipesOptions.skipLoading) {
|
|
139
136
|
dispatch(
|
|
140
|
-
loadPipesData(callableFeedUrl, { ...pipesOptions, riverId
|
|
137
|
+
ZappPipes.loadPipesData(callableFeedUrl, { ...pipesOptions, riverId })
|
|
141
138
|
);
|
|
142
139
|
}
|
|
143
|
-
}, [callableFeedUrl
|
|
140
|
+
}, [callableFeedUrl]);
|
|
144
141
|
|
|
145
142
|
return React.useMemo(() => {
|
|
146
143
|
if (!callableFeedUrl || !feedUrl) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { useDispatch } from "react-redux";
|
|
3
2
|
|
|
4
3
|
import { getDatasourceUrl } from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils/getDatasourceUrl";
|
|
5
4
|
import { usePipesContexts } from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils/usePipesContexts";
|
|
6
5
|
import { clearPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
7
6
|
|
|
8
|
-
import { useRoute } from "../navigation
|
|
7
|
+
import { useRoute } from "../navigation";
|
|
8
|
+
import { useAppDispatch } from "@applicaster/zapp-react-native-redux";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* reset river components cache when screen is unmounted
|
|
@@ -13,7 +13,7 @@ import { useRoute } from "../navigation/useRoute";
|
|
|
13
13
|
* @param {Array} riverComponents list of UI components
|
|
14
14
|
*/
|
|
15
15
|
export const usePipesCacheReset = (riverId, riverComponents) => {
|
|
16
|
-
const dispatch =
|
|
16
|
+
const dispatch = useAppDispatch();
|
|
17
17
|
const { screenData, pathname } = useRoute();
|
|
18
18
|
const pipesContexts = usePipesContexts(riverId, pathname);
|
|
19
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import * as R from "ramda";
|
|
3
|
-
import { View } from "react-native";
|
|
3
|
+
import { View, ViewStyle } from "react-native";
|
|
4
4
|
|
|
5
5
|
import { platformSelect } from "../../reactUtils";
|
|
6
6
|
|
|
@@ -49,13 +49,13 @@ export const useSequentialRenderItem = (data: Data) => {
|
|
|
49
49
|
const readyToDisplay =
|
|
50
50
|
index === 0 ? true : arePreviousComponentsReady(index);
|
|
51
51
|
|
|
52
|
-
const displayStyle = {
|
|
52
|
+
const displayStyle: ViewStyle = {
|
|
53
53
|
display: readyToDisplay ? "flex" : "none",
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
const readyStyle = {
|
|
57
57
|
visibility: readyToDisplay ? "visible" : "hidden",
|
|
58
|
-
};
|
|
58
|
+
} as ViewStyle;
|
|
59
59
|
|
|
60
60
|
const style = platformSelect({
|
|
61
61
|
tvos: readyStyle,
|
|
@@ -42,15 +42,17 @@ jest.mock("react-native-safe-area-context", () => ({
|
|
|
42
42
|
}));
|
|
43
43
|
|
|
44
44
|
jest.mock("../../../reactUtils", () => ({
|
|
45
|
+
...jest.requireActual("../../../reactUtils"),
|
|
45
46
|
platformSelect: jest.fn((specs) => specs[platform] || specs.default),
|
|
46
47
|
isTV: jest.fn(() => mock_tv_flag),
|
|
47
48
|
}));
|
|
48
49
|
|
|
49
50
|
jest.mock("../../navigation", () => ({
|
|
50
|
-
useNavigation: () => null,
|
|
51
51
|
useIsScreenActive: () => true,
|
|
52
52
|
}));
|
|
53
53
|
|
|
54
|
+
jest.mock("../../navigation/useNavigation");
|
|
55
|
+
|
|
54
56
|
const { Dimensions } = require("react-native");
|
|
55
57
|
const { useDimensions } = require("..");
|
|
56
58
|
|
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
import { NativeModules, Platform } from "react-native";
|
|
2
2
|
|
|
3
|
+
export const isAndroidTablet = () => {
|
|
4
|
+
const { initialProps } = NativeModules.QuickBrickCommunicationModule;
|
|
5
|
+
|
|
6
|
+
return initialProps?.is_tablet;
|
|
7
|
+
};
|
|
8
|
+
|
|
3
9
|
/**
|
|
4
10
|
* Determines wether the given device is a tablet based on dimensions, orientation, and platform
|
|
5
11
|
* @param {Object} dimensions - Dimensions object passed to the function
|
|
6
12
|
* @param {String} orientation - Orientation enum passed to the function
|
|
7
13
|
* @returns {Boolean} isTablet - returns whether the given device is a tablet
|
|
8
14
|
*/
|
|
9
|
-
export const isTablet = (
|
|
15
|
+
export const isTablet = (
|
|
16
|
+
dimensions?: { width: number; height: number },
|
|
17
|
+
orientation?: string
|
|
18
|
+
) => {
|
|
10
19
|
if (Platform?.OS === "ios") {
|
|
11
20
|
return Platform?.isPad;
|
|
12
21
|
} else if (Platform?.OS === "android") {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return initialProps?.is_tablet;
|
|
22
|
+
return isAndroidTablet();
|
|
16
23
|
}
|
|
17
24
|
|
|
18
|
-
const { width } = dimensions;
|
|
25
|
+
const { width } = dimensions || {};
|
|
19
26
|
|
|
20
27
|
if (width < 600) return false;
|
|
21
28
|
if (width >= 600 && width < 840) return orientation === "portrait";
|