@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.
- package/actionsExecutor/ActionExecutorContext.tsx +0 -1
- package/actionsExecutor/ScreenActions.ts +20 -19
- package/analyticsUtils/AnalyticsEvents/sendHeaderClickEvent.ts +1 -1
- package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -1
- package/analyticsUtils/__tests__/analyticsUtils.test.js +0 -11
- 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 +3 -3
- package/appUtils/contextKeysManager/contextResolver.ts +29 -1
- package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +5 -0
- package/appUtils/focusManager/__tests__/focusManager.test.js +1 -1
- package/appUtils/focusManager/index.ios.ts +10 -0
- package/appUtils/focusManager/index.ts +82 -11
- package/appUtils/focusManager/treeDataStructure/Tree/index.js +1 -1
- package/appUtils/focusManagerAux/utils/index.ts +106 -3
- 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 +546 -0
- package/configurationUtils/manifestKeyParser.ts +57 -32
- package/index.d.ts +0 -9
- package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
- package/navigationUtils/index.ts +6 -4
- package/package.json +2 -3
- package/playerUtils/index.ts +51 -0
- package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +15 -14
- package/reactHooks/cell-click/__tests__/index.test.js +3 -0
- package/reactHooks/debugging/__tests__/index.test.js +0 -1
- package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +47 -90
- package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +57 -37
- package/reactHooks/feed/index.ts +2 -0
- package/reactHooks/feed/useBatchLoading.ts +15 -8
- package/reactHooks/feed/useFeedLoader.tsx +39 -44
- package/reactHooks/feed/useLoadPipesDataDispatch.ts +57 -0
- package/reactHooks/feed/usePipesCacheReset.ts +2 -2
- 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/useScreenStateStore.ts +3 -6
- package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
- package/reactHooks/state/index.ts +1 -1
- package/reactHooks/state/useHomeRiver.ts +4 -2
- package/reactHooks/state/useRivers.ts +7 -8
- package/screenPickerUtils/index.ts +7 -0
- package/storage/ScreenSingleValueProvider.ts +25 -22
- package/storage/ScreenStateMultiSelectProvider.ts +26 -23
- package/testUtils/index.tsx +7 -8
- package/time/BackgroundTimer.ts +1 -1
- package/utils/__tests__/find.test.ts +36 -0
- package/utils/__tests__/pathOr.test.ts +37 -0
- package/utils/__tests__/startsWith.test.ts +30 -0
- package/utils/find.ts +3 -0
- package/utils/index.ts +8 -0
- package/utils/pathOr.ts +5 -0
- package/utils/startsWith.ts +9 -0
|
@@ -2,15 +2,12 @@ import { renderHook } from "@testing-library/react-hooks";
|
|
|
2
2
|
import * as R from "ramda";
|
|
3
3
|
import * as zappPipesModule from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
4
4
|
import * as reactReduxModules from "react-redux";
|
|
5
|
-
import { Provider } from "react-redux";
|
|
6
5
|
import * as React from "react";
|
|
7
|
-
import configureStore from "redux-mock-store";
|
|
8
|
-
import thunk from "redux-thunk";
|
|
9
6
|
import * as useRouteHook from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute";
|
|
10
7
|
import * as useNavigationHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
|
|
11
8
|
import { useFeedLoader } from "../useFeedLoader";
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
import { WrappedWithProviders } from "../../../testUtils";
|
|
10
|
+
import { ScreenStateResolver } from "../../../appUtils/contextKeysManager/contextResolver";
|
|
14
11
|
|
|
15
12
|
jest.useFakeTimers({ legacyFakeTimers: true });
|
|
16
13
|
|
|
@@ -55,13 +52,15 @@ const mockZappPipesData = {
|
|
|
55
52
|
|
|
56
53
|
describe("useFeedLoader", () => {
|
|
57
54
|
describe("with cached feed url", () => {
|
|
58
|
-
const store =
|
|
55
|
+
const store = {
|
|
59
56
|
plugins: [],
|
|
60
57
|
zappPipes: { "test://testfakeurl": mockZappPipesData },
|
|
61
|
-
}
|
|
58
|
+
};
|
|
62
59
|
|
|
63
|
-
const wrapper: React.FC<any> = ({ children }) => (
|
|
64
|
-
<
|
|
60
|
+
const wrapper: React.FC<any> = ({ children, ...props }) => (
|
|
61
|
+
<WrappedWithProviders store={props.store || store}>
|
|
62
|
+
{children}
|
|
63
|
+
</WrappedWithProviders>
|
|
65
64
|
);
|
|
66
65
|
|
|
67
66
|
it("returns cached feed", () => {
|
|
@@ -110,8 +109,10 @@ describe("useFeedLoader", () => {
|
|
|
110
109
|
describe("without cached feeds", () => {
|
|
111
110
|
const feedUrl = "test://testfakeurl2";
|
|
112
111
|
|
|
113
|
-
const wrapper: React.FC<any> = ({ children,
|
|
114
|
-
<
|
|
112
|
+
const wrapper: React.FC<any> = ({ children, ...props }) => (
|
|
113
|
+
<WrappedWithProviders store={props.store}>
|
|
114
|
+
{children}
|
|
115
|
+
</WrappedWithProviders>
|
|
115
116
|
);
|
|
116
117
|
|
|
117
118
|
it("It loads data for new url and returns it", () => {
|
|
@@ -123,10 +124,10 @@ describe("useFeedLoader", () => {
|
|
|
123
124
|
.spyOn(zappPipesModule, "loadPipesData")
|
|
124
125
|
.mockImplementation(jest.fn());
|
|
125
126
|
|
|
126
|
-
const initialStore =
|
|
127
|
+
const initialStore = {
|
|
127
128
|
plugins: [],
|
|
128
129
|
zappPipes: { "test://testfakeurl": "foobar" },
|
|
129
|
-
}
|
|
130
|
+
};
|
|
130
131
|
|
|
131
132
|
const { result, rerender } = renderHook(
|
|
132
133
|
() => useFeedLoader({ feedUrl: "test://testfakeurl2" }),
|
|
@@ -135,20 +136,19 @@ describe("useFeedLoader", () => {
|
|
|
135
136
|
|
|
136
137
|
expect(result.current.data).toBeNull();
|
|
137
138
|
|
|
138
|
-
expect(loadPipesDataSpy).
|
|
139
|
+
expect(loadPipesDataSpy).toHaveBeenCalledWith(feedUrl, {
|
|
139
140
|
clearCache: true,
|
|
140
141
|
riverId: undefined,
|
|
142
|
+
callback: expect.any(Function),
|
|
141
143
|
resolvers: {
|
|
142
|
-
screen:
|
|
143
|
-
screenStateStore: undefined,
|
|
144
|
-
},
|
|
144
|
+
screen: expect.any(ScreenStateResolver),
|
|
145
145
|
},
|
|
146
146
|
});
|
|
147
147
|
|
|
148
|
-
const store2 =
|
|
148
|
+
const store2 = {
|
|
149
149
|
plugins: [],
|
|
150
150
|
zappPipes: { "test://testfakeurl2": mockZappPipesData },
|
|
151
|
-
}
|
|
151
|
+
};
|
|
152
152
|
|
|
153
153
|
rerender({ store: store2 });
|
|
154
154
|
|
|
@@ -169,10 +169,10 @@ describe("useFeedLoader", () => {
|
|
|
169
169
|
.spyOn(reactReduxModules, "useDispatch")
|
|
170
170
|
.mockImplementation(() => jest.fn());
|
|
171
171
|
|
|
172
|
-
const initialStore =
|
|
172
|
+
const initialStore = {
|
|
173
173
|
plugins: [],
|
|
174
174
|
zappPipes: { "test://testfakeurl": "foobar" },
|
|
175
|
-
}
|
|
175
|
+
};
|
|
176
176
|
|
|
177
177
|
const { result, rerender } = renderHook(
|
|
178
178
|
() => useFeedLoader({ feedUrl: "test://testfakeurl2" }),
|
|
@@ -181,20 +181,22 @@ describe("useFeedLoader", () => {
|
|
|
181
181
|
|
|
182
182
|
expect(result.current.data).toBeNull();
|
|
183
183
|
|
|
184
|
-
expect(loadPipesDataSpy).
|
|
184
|
+
expect(loadPipesDataSpy.mock.calls[0][0]).toBe(feedUrl);
|
|
185
|
+
|
|
186
|
+
expect(loadPipesDataSpy.mock.calls[0][1]).toMatchObject({
|
|
185
187
|
clearCache: true,
|
|
186
188
|
riverId: undefined,
|
|
187
189
|
resolvers: {
|
|
188
190
|
screen: {
|
|
189
|
-
screenStateStore:
|
|
191
|
+
screenStateStore: expect.any(Function),
|
|
190
192
|
},
|
|
191
193
|
},
|
|
192
194
|
});
|
|
193
195
|
|
|
194
|
-
const store2 =
|
|
196
|
+
const store2 = {
|
|
195
197
|
plugins: [],
|
|
196
198
|
zappPipes: { "test://testfakeurl2": mockZappPipesData },
|
|
197
|
-
}
|
|
199
|
+
};
|
|
198
200
|
|
|
199
201
|
rerender({ store: store2 });
|
|
200
202
|
|
|
@@ -207,8 +209,10 @@ describe("useFeedLoader", () => {
|
|
|
207
209
|
const feedUrl = "test://testfakeurl";
|
|
208
210
|
const feedUrlWithNext = "test://withnexttestfakeurl";
|
|
209
211
|
|
|
210
|
-
const wrapper: React.FC<any> = ({ children,
|
|
211
|
-
<
|
|
212
|
+
const wrapper: React.FC<any> = ({ children, ...props }) => (
|
|
213
|
+
<WrappedWithProviders store={props.store || {}}>
|
|
214
|
+
{children}
|
|
215
|
+
</WrappedWithProviders>
|
|
212
216
|
);
|
|
213
217
|
|
|
214
218
|
describe("reloadData", () => {
|
|
@@ -221,10 +225,10 @@ describe("useFeedLoader", () => {
|
|
|
221
225
|
.spyOn(reactReduxModules, "useDispatch")
|
|
222
226
|
.mockImplementation(() => jest.fn());
|
|
223
227
|
|
|
224
|
-
const initialStore =
|
|
228
|
+
const initialStore = {
|
|
225
229
|
plugins: [],
|
|
226
230
|
zappPipes: { [feedUrl]: "foobar" },
|
|
227
|
-
}
|
|
231
|
+
};
|
|
228
232
|
|
|
229
233
|
const { result } = renderHook(() => useFeedLoader({ feedUrl }), {
|
|
230
234
|
wrapper,
|
|
@@ -233,14 +237,22 @@ describe("useFeedLoader", () => {
|
|
|
233
237
|
|
|
234
238
|
const { reloadData } = result.current;
|
|
235
239
|
|
|
236
|
-
reloadData();
|
|
240
|
+
reloadData?.();
|
|
241
|
+
|
|
242
|
+
expect(loadPipesDataSpy).toHaveBeenCalled();
|
|
243
|
+
|
|
244
|
+
expect(
|
|
245
|
+
loadPipesDataSpy.mock.calls[loadPipesDataSpy.mock.calls.length - 1][0]
|
|
246
|
+
).toBe(feedUrl);
|
|
237
247
|
|
|
238
|
-
expect(
|
|
248
|
+
expect(
|
|
249
|
+
loadPipesDataSpy.mock.calls[loadPipesDataSpy.mock.calls.length - 1][1]
|
|
250
|
+
).toMatchObject({
|
|
239
251
|
clearCache: true,
|
|
240
252
|
silentRefresh: true,
|
|
241
253
|
resolvers: {
|
|
242
254
|
screen: {
|
|
243
|
-
screenStateStore:
|
|
255
|
+
screenStateStore: expect.any(Function),
|
|
244
256
|
},
|
|
245
257
|
},
|
|
246
258
|
});
|
|
@@ -262,10 +274,10 @@ describe("useFeedLoader", () => {
|
|
|
262
274
|
.spyOn(reactReduxModules, "useDispatch")
|
|
263
275
|
.mockImplementation(() => jest.fn());
|
|
264
276
|
|
|
265
|
-
const initialStore =
|
|
277
|
+
const initialStore = {
|
|
266
278
|
plugins: [],
|
|
267
279
|
zappPipes: { [feedUrlWithNext]: { data: { next: nextUrl } } },
|
|
268
|
-
}
|
|
280
|
+
};
|
|
269
281
|
|
|
270
282
|
const { result } = renderHook(
|
|
271
283
|
() => useFeedLoader({ feedUrl: feedUrlWithNext }),
|
|
@@ -277,14 +289,22 @@ describe("useFeedLoader", () => {
|
|
|
277
289
|
|
|
278
290
|
const { loadNext } = result.current;
|
|
279
291
|
|
|
280
|
-
loadNext();
|
|
292
|
+
loadNext?.();
|
|
293
|
+
|
|
294
|
+
expect(loadPipesDataSpy).toHaveBeenCalled();
|
|
295
|
+
|
|
296
|
+
expect(
|
|
297
|
+
loadPipesDataSpy.mock.calls[loadPipesDataSpy.mock.calls.length - 1][0]
|
|
298
|
+
).toBe(nextUrl);
|
|
281
299
|
|
|
282
|
-
expect(
|
|
300
|
+
expect(
|
|
301
|
+
loadPipesDataSpy.mock.calls[loadPipesDataSpy.mock.calls.length - 1][1]
|
|
302
|
+
).toMatchObject({
|
|
283
303
|
parentFeed: feedUrlWithNext,
|
|
284
304
|
silentRefresh: true,
|
|
285
305
|
resolvers: {
|
|
286
306
|
screen: {
|
|
287
|
-
screenStateStore:
|
|
307
|
+
screenStateStore: expect.any(Function),
|
|
288
308
|
},
|
|
289
309
|
},
|
|
290
310
|
});
|
package/reactHooks/feed/index.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
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
|
-
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
3
|
+
import { useZappPipesFeed } from "@applicaster/zapp-react-native-redux";
|
|
6
4
|
import { isNilOrEmpty } from "../../reactUtils/helpers";
|
|
7
5
|
import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
|
|
8
6
|
import {
|
|
9
7
|
getInflatedDataSourceUrl,
|
|
10
8
|
getSearchContext,
|
|
9
|
+
useLoadPipesDataDispatch,
|
|
11
10
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
11
|
import { isGallery } from "@applicaster/zapp-react-native-utils/componentsUtils";
|
|
13
12
|
import { useScreenContext } from "../screen";
|
|
@@ -63,7 +62,6 @@ export const useBatchLoading = (
|
|
|
63
62
|
componentsToRender: { data?: ZappDataSource; component_type: string }[],
|
|
64
63
|
options: Options
|
|
65
64
|
) => {
|
|
66
|
-
const dispatch = useDispatch();
|
|
67
65
|
const { screen: screenContext, entry: entryContext } = useScreenContext();
|
|
68
66
|
const [searchContext] = ZappPipesSearchContext.useZappPipesContext();
|
|
69
67
|
const [hasEverBeenReady, setHasEverBeenReady] = React.useState(false);
|
|
@@ -118,7 +116,9 @@ export const useBatchLoading = (
|
|
|
118
116
|
[]
|
|
119
117
|
);
|
|
120
118
|
|
|
121
|
-
const feeds =
|
|
119
|
+
const feeds = useZappPipesFeed(feedUrls);
|
|
120
|
+
|
|
121
|
+
const loadPipesDataDispatcher = useLoadPipesDataDispatch();
|
|
122
122
|
|
|
123
123
|
// dispatch loadPipesData for each feed that is not loaded
|
|
124
124
|
const runBatchLoading = React.useCallback(() => {
|
|
@@ -138,13 +138,20 @@ export const useBatchLoading = (
|
|
|
138
138
|
|
|
139
139
|
if (mappedFeedUrl) {
|
|
140
140
|
// 4. load data
|
|
141
|
-
return
|
|
142
|
-
|
|
141
|
+
return loadPipesDataDispatcher(
|
|
142
|
+
mappedFeedUrl,
|
|
143
|
+
{
|
|
144
|
+
riverId: options.riverId,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
withResolvers: true,
|
|
148
|
+
withScreenRouteMapping: true,
|
|
149
|
+
}
|
|
143
150
|
);
|
|
144
151
|
}
|
|
145
152
|
}
|
|
146
153
|
});
|
|
147
|
-
}, [feedUrls, feeds]);
|
|
154
|
+
}, [feedUrls, feeds, loadPipesDataDispatcher]);
|
|
148
155
|
|
|
149
156
|
React.useEffect(() => {
|
|
150
157
|
runBatchLoading();
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import React, { useEffect } from "react";
|
|
2
|
-
import { useDispatch } from "react-redux";
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
import { useZappPipesFeed } from "@applicaster/zapp-react-native-redux/hooks";
|
|
3
|
+
import { useZappPipesFeed } from "@applicaster/zapp-react-native-redux";
|
|
6
4
|
|
|
7
5
|
import { reactHooksLogger } from "../logger";
|
|
8
6
|
import { shouldDispatchData, useIsInitialRender } from "../utils";
|
|
9
7
|
import { useInflatedUrl } from "./useInflatedUrl";
|
|
10
|
-
import {
|
|
11
|
-
import { useScreenResolvers } from "@applicaster/zapp-react-native-utils/actionsExecutor/screenResolver";
|
|
8
|
+
import { useLoadPipesDataDispatch } from "./useLoadPipesDataDispatch";
|
|
12
9
|
|
|
13
10
|
const logger = reactHooksLogger.addSubsystem("useFeedLoader");
|
|
14
11
|
|
|
@@ -50,64 +47,62 @@ export const useFeedLoader = ({
|
|
|
50
47
|
}, []);
|
|
51
48
|
|
|
52
49
|
const isInitialRender = useIsInitialRender();
|
|
53
|
-
const dispatch = useDispatch();
|
|
54
|
-
const { screenData } = useRoute();
|
|
55
|
-
const resolvers = useScreenResolvers();
|
|
56
50
|
|
|
57
51
|
const callableFeedUrl = useInflatedUrl({ feedUrl, mapping });
|
|
58
52
|
|
|
59
53
|
const currentFeed = useZappPipesFeed(callableFeedUrl);
|
|
60
54
|
|
|
61
|
-
const
|
|
62
|
-
(screenData as LegacyNavigationScreenData)?.targetScreen?.id ??
|
|
63
|
-
screenData?.id;
|
|
55
|
+
const loadPipesDataDispatcher = useLoadPipesDataDispatch();
|
|
64
56
|
|
|
65
57
|
const reloadData = React.useCallback<ReloadDataFunction>(
|
|
66
58
|
(silentRefresh = true, callback) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
59
|
+
loadPipesDataDispatcher(
|
|
60
|
+
callableFeedUrl,
|
|
61
|
+
{
|
|
62
|
+
clearCache: true,
|
|
63
|
+
silentRefresh,
|
|
64
|
+
callback,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
withResolvers: true,
|
|
68
|
+
}
|
|
69
|
+
);
|
|
78
70
|
},
|
|
79
|
-
[callableFeedUrl
|
|
71
|
+
[callableFeedUrl]
|
|
80
72
|
);
|
|
81
73
|
|
|
82
74
|
const loadNext: FeedLoaderResponse["loadNext"] = React.useCallback(() => {
|
|
83
75
|
if (callableFeedUrl) {
|
|
84
76
|
const nextFeed = currentFeed?.data?.next;
|
|
85
77
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
78
|
+
loadPipesDataDispatcher(
|
|
79
|
+
nextFeed,
|
|
80
|
+
{
|
|
81
|
+
silentRefresh: true,
|
|
82
|
+
parentFeed: callableFeedUrl,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
withResolvers: true,
|
|
86
|
+
}
|
|
87
|
+
);
|
|
96
88
|
}
|
|
97
|
-
}, [callableFeedUrl, currentFeed?.data?.next
|
|
89
|
+
}, [callableFeedUrl, currentFeed?.data?.next]);
|
|
98
90
|
|
|
99
91
|
useEffect(() => {
|
|
100
92
|
if (
|
|
101
93
|
shouldDispatchData(callableFeedUrl, currentFeed, pipesOptions.clearCache)
|
|
102
94
|
) {
|
|
103
95
|
if (callableFeedUrl && !pipesOptions.skipLoading) {
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
loadPipesDataDispatcher(
|
|
97
|
+
callableFeedUrl,
|
|
98
|
+
{
|
|
106
99
|
...pipesOptions,
|
|
107
100
|
clearCache: true,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
withResolvers: true,
|
|
104
|
+
withScreenRouteMapping: true,
|
|
105
|
+
}
|
|
111
106
|
);
|
|
112
107
|
} else if (!callableFeedUrl) {
|
|
113
108
|
logger.info({
|
|
@@ -131,16 +126,16 @@ export const useFeedLoader = ({
|
|
|
131
126
|
jsOnly: true,
|
|
132
127
|
});
|
|
133
128
|
}
|
|
134
|
-
}, [
|
|
129
|
+
}, []);
|
|
135
130
|
|
|
136
131
|
// Reload feed when feedUrl changes, unless skipLoading is true
|
|
137
132
|
useEffect(() => {
|
|
138
133
|
if (!isInitialRender && callableFeedUrl && !pipesOptions.skipLoading) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
);
|
|
134
|
+
loadPipesDataDispatcher(callableFeedUrl, pipesOptions, {
|
|
135
|
+
withResolvers: true,
|
|
136
|
+
});
|
|
142
137
|
}
|
|
143
|
-
}, [callableFeedUrl,
|
|
138
|
+
}, [callableFeedUrl, isInitialRender, pipesOptions.skipLoading]);
|
|
144
139
|
|
|
145
140
|
return React.useMemo(() => {
|
|
146
141
|
if (!callableFeedUrl || !feedUrl) {
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useAppDispatch,
|
|
3
|
+
ZappPipes,
|
|
4
|
+
} from "@applicaster/zapp-react-native-redux";
|
|
5
|
+
import { applyScreenRouteDefaults } from "@applicaster/zapp-react-native-redux/ZappPipes/feedProcessor";
|
|
6
|
+
import React from "react";
|
|
7
|
+
import { useScreenResolvers } from "../../actionsExecutor/screenResolver";
|
|
8
|
+
import { useRoute } from "../navigation";
|
|
9
|
+
import { useScreenStateStore } from "../navigation/useScreenStateStore";
|
|
10
|
+
|
|
11
|
+
export const useLoadPipesDataDispatch = () => {
|
|
12
|
+
const screenStateStore = useScreenStateStore();
|
|
13
|
+
const resolvers = useScreenResolvers();
|
|
14
|
+
const dispatch = useAppDispatch();
|
|
15
|
+
|
|
16
|
+
const { pathname, screenData } = useRoute();
|
|
17
|
+
|
|
18
|
+
const riverId =
|
|
19
|
+
(screenData as LegacyNavigationScreenData)?.targetScreen?.id ??
|
|
20
|
+
screenData?.id;
|
|
21
|
+
|
|
22
|
+
const onLoadCB = (options) => (data, _err) => {
|
|
23
|
+
options?.callback?.();
|
|
24
|
+
|
|
25
|
+
if (data) {
|
|
26
|
+
applyScreenRouteDefaults(data, screenStateStore, pathname);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
return React.useCallback(
|
|
31
|
+
(
|
|
32
|
+
url: string,
|
|
33
|
+
options = {},
|
|
34
|
+
{
|
|
35
|
+
withResolvers = false,
|
|
36
|
+
withScreenRouteMapping = false,
|
|
37
|
+
}: {
|
|
38
|
+
withResolvers?: boolean;
|
|
39
|
+
withScreenRouteMapping?: boolean;
|
|
40
|
+
} = {}
|
|
41
|
+
) => {
|
|
42
|
+
if (url) {
|
|
43
|
+
dispatch(
|
|
44
|
+
ZappPipes.loadPipesData(url, {
|
|
45
|
+
riverId,
|
|
46
|
+
resolvers: withResolvers ? resolvers : undefined,
|
|
47
|
+
...options,
|
|
48
|
+
callback: withScreenRouteMapping
|
|
49
|
+
? onLoadCB(options)
|
|
50
|
+
: options?.callback,
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
[]
|
|
56
|
+
);
|
|
57
|
+
};
|
|
@@ -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
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";
|
|
|
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";
|