@applicaster/zapp-react-native-ui-components 14.0.0-alpha.3126393935 → 14.0.0-alpha.3471443312
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/Components/Cell/index.js +1 -1
- package/Components/ComponentResolver/index.ts +1 -1
- package/Components/FeedLoader/index.js +1 -1
- package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
- package/Components/GeneralContentScreen/utils/useCurationAPI.ts +12 -8
- package/Components/HandlePlayable/HandlePlayable.tsx +11 -1
- package/Components/Layout/TV/LayoutBackground.tsx +1 -1
- package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
- package/Components/MasterCell/utils/behaviorProvider.ts +14 -82
- package/Components/MasterCell/utils/index.ts +3 -23
- package/Components/OfflineHandler/__tests__/index.test.tsx +20 -22
- package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
- package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
- package/Components/PlayerContainer/index.ts +1 -1
- package/Components/River/RefreshControl.tsx +6 -4
- package/Components/River/index.tsx +1 -1
- package/Components/Screen/__tests__/Screen.test.tsx +23 -12
- package/Components/Transitioner/Scene.tsx +0 -1
- package/Contexts/ScreenDataContext/index.tsx +0 -2
- package/Decorators/RiverFeedLoader/index.tsx +2 -8
- package/Decorators/RiverFeedLoader/utils/index.ts +2 -7
- package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
- package/Decorators/ZappPipesDataConnector/index.tsx +2 -20
- package/package.json +5 -5
package/Components/Cell/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
|
|
3
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
3
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
4
4
|
import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
5
5
|
|
|
6
6
|
import {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
|
|
3
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
3
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
4
4
|
|
|
5
5
|
import { ComponentResolverComponent } from "./ComponentResolver";
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
|
|
3
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
3
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
4
4
|
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
5
5
|
|
|
6
6
|
import { FeedLoaderComponent } from "./FeedLoader";
|
|
@@ -8,13 +8,10 @@ import {
|
|
|
8
8
|
useCurationAPI,
|
|
9
9
|
} from "../useCurationAPI";
|
|
10
10
|
import * as redux from "react-redux";
|
|
11
|
-
import * as layoutPresets from "@applicaster/zapp-react-native-redux/hooks/useLayoutPresets";
|
|
12
|
-
import * as pipesFeeds from "@applicaster/zapp-react-native-redux/hooks/useZappPipesFeeds";
|
|
13
11
|
import { NavigationContext } from "@applicaster/zapp-react-native-ui-components/Contexts/NavigationContext";
|
|
14
12
|
import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
|
|
15
13
|
|
|
16
|
-
import {
|
|
17
|
-
import configureStore from "redux-mock-store";
|
|
14
|
+
import { WrappedWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
18
15
|
|
|
19
16
|
jest.mock(
|
|
20
17
|
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute",
|
|
@@ -42,19 +39,20 @@ const mainStackNavigator = {
|
|
|
42
39
|
},
|
|
43
40
|
};
|
|
44
41
|
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
const getWrapper =
|
|
43
|
+
(store) =>
|
|
44
|
+
// eslint-disable-next-line react/display-name, react/prop-types
|
|
45
|
+
({ children }) => (
|
|
46
|
+
<WrappedWithProviders store={store}>
|
|
47
|
+
<NavigationContext.Provider
|
|
48
|
+
value={{ ...mainStackNavigator, currentRoute: homeStack.route }}
|
|
49
|
+
>
|
|
50
|
+
<PathnameContext.Provider value={homeStack.route}>
|
|
51
|
+
{children}
|
|
52
|
+
</PathnameContext.Provider>
|
|
53
|
+
</NavigationContext.Provider>
|
|
54
|
+
</WrappedWithProviders>
|
|
55
|
+
);
|
|
58
56
|
|
|
59
57
|
describe("getTransformedPreset should return the passed components if smartComponents is empty", () => {
|
|
60
58
|
describe("getTransformedPreset function", () => {
|
|
@@ -312,19 +310,10 @@ describe("getTransformedPreset should return the passed components if smartCompo
|
|
|
312
310
|
{ id: "02", component_type: "not_smart_another" },
|
|
313
311
|
];
|
|
314
312
|
|
|
315
|
-
// mock the hooks
|
|
316
|
-
const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
|
|
317
|
-
mockUseZappPipesFeeds.mockReturnValue({});
|
|
318
|
-
|
|
319
|
-
const mockUseLayoutPresets = jest.spyOn(
|
|
320
|
-
layoutPresets,
|
|
321
|
-
"useLayoutPresets"
|
|
322
|
-
);
|
|
323
|
-
|
|
324
|
-
mockUseLayoutPresets.mockReturnValue({});
|
|
325
|
-
|
|
326
313
|
const { result } = renderHook(() => useCurationAPI(mockComponents), {
|
|
327
|
-
wrapper
|
|
314
|
+
wrapper: getWrapper({
|
|
315
|
+
zappPipes: {},
|
|
316
|
+
}),
|
|
328
317
|
});
|
|
329
318
|
|
|
330
319
|
// if there are no smart components, it should return the original array
|
|
@@ -366,18 +355,15 @@ describe("getTransformedPreset should return the passed components if smartCompo
|
|
|
366
355
|
"http://curation": { loading: false, data: { entry: mockPresetEntry } },
|
|
367
356
|
};
|
|
368
357
|
|
|
369
|
-
const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
|
|
370
|
-
mockUseZappPipesFeeds.mockReturnValue(mockFeeds);
|
|
371
|
-
|
|
372
|
-
const mockUseLayoutPresets = jest.spyOn(
|
|
373
|
-
layoutPresets,
|
|
374
|
-
"useLayoutPresets"
|
|
375
|
-
);
|
|
376
|
-
|
|
377
|
-
mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
|
|
378
|
-
|
|
379
358
|
const { result } = renderHook(() => useCurationAPI(mockComponents), {
|
|
380
|
-
wrapper
|
|
359
|
+
wrapper: getWrapper({
|
|
360
|
+
zappPipes: mockFeeds,
|
|
361
|
+
presetsMapping: {
|
|
362
|
+
presets_mappings: {
|
|
363
|
+
...mockLayoutPresets,
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
}),
|
|
381
367
|
});
|
|
382
368
|
|
|
383
369
|
expect(result.current).toEqual(mockTransformedComponents);
|
|
@@ -437,19 +423,15 @@ describe("getTransformedPreset should return the passed components if smartCompo
|
|
|
437
423
|
},
|
|
438
424
|
};
|
|
439
425
|
|
|
440
|
-
// mock the hooks
|
|
441
|
-
const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
|
|
442
|
-
mockUseZappPipesFeeds.mockReturnValue(mockFeeds);
|
|
443
|
-
|
|
444
|
-
const mockUseLayoutPresets = jest.spyOn(
|
|
445
|
-
layoutPresets,
|
|
446
|
-
"useLayoutPresets"
|
|
447
|
-
);
|
|
448
|
-
|
|
449
|
-
mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
|
|
450
|
-
|
|
451
426
|
const { result } = renderHook(() => useCurationAPI(mockComponents), {
|
|
452
|
-
wrapper
|
|
427
|
+
wrapper: getWrapper({
|
|
428
|
+
zappPipes: mockFeeds,
|
|
429
|
+
presetsMapping: {
|
|
430
|
+
presets_mappings: {
|
|
431
|
+
...mockLayoutPresets,
|
|
432
|
+
},
|
|
433
|
+
},
|
|
434
|
+
}),
|
|
453
435
|
});
|
|
454
436
|
|
|
455
437
|
expect(result.current).toEqual(mockTransformedComponents);
|
|
@@ -495,14 +477,15 @@ describe("getTransformedPreset should return the passed components if smartCompo
|
|
|
495
477
|
"http://curation": { loading: false, data: { entry: mockPresetEntry } },
|
|
496
478
|
};
|
|
497
479
|
|
|
498
|
-
// mock the hooks
|
|
499
|
-
const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
|
|
500
|
-
mockUseZappPipesFeeds.mockReturnValue(mockFeeds);
|
|
501
|
-
const mockUseLayoutPresets = jest.spyOn(layoutPresets, "useLayoutPresets");
|
|
502
|
-
mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
|
|
503
|
-
|
|
504
480
|
const { result } = renderHook(() => useCurationAPI(mockComponents), {
|
|
505
|
-
wrapper
|
|
481
|
+
wrapper: getWrapper({
|
|
482
|
+
zappPipes: mockFeeds,
|
|
483
|
+
presetsMapping: {
|
|
484
|
+
presets_mappings: {
|
|
485
|
+
...mockLayoutPresets,
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
}),
|
|
506
489
|
});
|
|
507
490
|
|
|
508
491
|
expect(result.current).toEqual(mockTransformedComponents);
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { all, equals, path, prop, isEmpty, pluck, values } from "ramda";
|
|
2
2
|
|
|
3
3
|
import { useEffect, useMemo } from "react";
|
|
4
|
-
import { useDispatch } from "react-redux";
|
|
5
4
|
|
|
6
5
|
import {
|
|
6
|
+
ZappPipes,
|
|
7
|
+
useAppDispatch,
|
|
7
8
|
useLayoutPresets,
|
|
8
|
-
|
|
9
|
-
} from "@applicaster/zapp-react-native-redux
|
|
10
|
-
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
9
|
+
useZappPipesFeed,
|
|
10
|
+
} from "@applicaster/zapp-react-native-redux";
|
|
11
11
|
import { isEmptyOrNil } from "@applicaster/zapp-react-native-utils/cellUtils";
|
|
12
12
|
import { Categories } from "./logger";
|
|
13
13
|
import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
|
|
14
14
|
import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute";
|
|
15
|
+
|
|
15
16
|
import {
|
|
16
17
|
ZappPipesEntryContext,
|
|
17
18
|
ZappPipesScreenContext,
|
|
@@ -26,7 +27,10 @@ import {
|
|
|
26
27
|
import { produce } from "immer";
|
|
27
28
|
// types reference
|
|
28
29
|
|
|
29
|
-
declare
|
|
30
|
+
declare interface CurationEntry {
|
|
31
|
+
preset_name: string;
|
|
32
|
+
feed_url: string;
|
|
33
|
+
}
|
|
30
34
|
|
|
31
35
|
type Feeds = Record<string, ZappPipesData>;
|
|
32
36
|
|
|
@@ -122,7 +126,7 @@ export const getFinalComponents = (
|
|
|
122
126
|
export const useCurationAPI = (
|
|
123
127
|
components: Array<ZappUIComponent>
|
|
124
128
|
): ZappUIComponent[] => {
|
|
125
|
-
const dispatch =
|
|
129
|
+
const dispatch = useAppDispatch();
|
|
126
130
|
|
|
127
131
|
const smartComponents = useMemo(
|
|
128
132
|
() => components?.filter?.(isSmartComponent) ?? [],
|
|
@@ -162,7 +166,7 @@ export const useCurationAPI = (
|
|
|
162
166
|
useEffect(() => {
|
|
163
167
|
urls.forEach((url, index) => {
|
|
164
168
|
if (url) {
|
|
165
|
-
dispatch(loadPipesData(url, { clearCache: false }));
|
|
169
|
+
dispatch(ZappPipes.loadPipesData(url, { clearCache: false }));
|
|
166
170
|
} else {
|
|
167
171
|
logger.log_error("Curation url is empty", {
|
|
168
172
|
componentId: smartComponents?.[index]?.id,
|
|
@@ -171,7 +175,7 @@ export const useCurationAPI = (
|
|
|
171
175
|
});
|
|
172
176
|
}, [urls]);
|
|
173
177
|
|
|
174
|
-
const feeds =
|
|
178
|
+
const feeds = useZappPipesFeed(urls);
|
|
175
179
|
const layoutPresets = useLayoutPresets();
|
|
176
180
|
|
|
177
181
|
const enrichedComponents = useMemo(() => {
|
|
@@ -7,12 +7,14 @@ import {
|
|
|
7
7
|
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
8
8
|
import {
|
|
9
9
|
useDimensions,
|
|
10
|
+
useIsTablet as isTablet,
|
|
10
11
|
useNavigation,
|
|
11
12
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
13
|
|
|
13
14
|
import { BufferAnimation } from "../PlayerContainer/BufferAnimation";
|
|
14
15
|
import { PlayerContainer } from "../PlayerContainer";
|
|
15
16
|
import { useModalSize } from "../VideoModal/hooks";
|
|
17
|
+
import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
16
18
|
|
|
17
19
|
type Props = {
|
|
18
20
|
item: ZappEntry;
|
|
@@ -83,6 +85,13 @@ type PlayableComponent = {
|
|
|
83
85
|
Component: React.ComponentType<any>;
|
|
84
86
|
};
|
|
85
87
|
|
|
88
|
+
const dimensionsContext: "window" | "screen" = platformSelect({
|
|
89
|
+
android_tv: "window",
|
|
90
|
+
amazon: "window",
|
|
91
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
92
|
+
default: isTablet() ? "window" : "screen", // on tablet, window represents correct values, on phone it's not as the screen could be rotated
|
|
93
|
+
});
|
|
94
|
+
|
|
86
95
|
export function HandlePlayable({
|
|
87
96
|
item,
|
|
88
97
|
isModal,
|
|
@@ -135,7 +144,8 @@ export function HandlePlayable({
|
|
|
135
144
|
});
|
|
136
145
|
}, [casting]);
|
|
137
146
|
|
|
138
|
-
const { width: screenWidth, height: screenHeight } =
|
|
147
|
+
const { width: screenWidth, height: screenHeight } =
|
|
148
|
+
useDimensions(dimensionsContext);
|
|
139
149
|
|
|
140
150
|
const modalSize = useModalSize();
|
|
141
151
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks
|
|
2
|
+
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
3
3
|
import { getBackgroundImageUrl } from "../utils";
|
|
4
4
|
import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
5
5
|
|
|
@@ -4,7 +4,7 @@ import * as R from "ramda";
|
|
|
4
4
|
import { TouchableOpacity } from "react-native";
|
|
5
5
|
// import { SvgUri } from "react-native-svg";
|
|
6
6
|
|
|
7
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
7
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
8
8
|
import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
|
|
9
9
|
|
|
10
10
|
import Image from "./Image";
|
|
@@ -1,58 +1,28 @@
|
|
|
1
1
|
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
2
|
-
import { StorageSingleValueProvider } from "@applicaster/zapp-react-native-
|
|
2
|
+
import { StorageSingleValueProvider } from "@applicaster/zapp-react-native-bridge/ZappStorage/StorageSingleSelectProvider";
|
|
3
3
|
import { PushTopicManager } from "@applicaster/zapp-react-native-bridge/PushNotifications/PushTopicManager";
|
|
4
|
-
import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-
|
|
4
|
+
import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-bridge/ZappStorage/StorageMultiSelectProvider";
|
|
5
5
|
import React, { useEffect } from "react";
|
|
6
6
|
import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
|
|
7
7
|
import { BehaviorSubject } from "rxjs";
|
|
8
8
|
import { masterCellLogger } from "../logger";
|
|
9
9
|
import get from "lodash/get";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const parseContextKey = (
|
|
16
|
-
key: string,
|
|
17
|
-
context: string = "ctx"
|
|
18
|
-
): string | null => {
|
|
19
|
-
if (!key?.startsWith(`@{${context}/`)) return null;
|
|
20
|
-
|
|
21
|
-
return key.substring(`@{${context}/`.length, key.length - 1);
|
|
10
|
+
|
|
11
|
+
const parseContextKey = (key: string): string | null => {
|
|
12
|
+
if (!key?.startsWith("@{ctx/")) return null;
|
|
13
|
+
|
|
14
|
+
return key.substring("@{ctx/".length, key.length - 1);
|
|
22
15
|
};
|
|
23
16
|
|
|
24
17
|
const getDataSourceProvider = (
|
|
25
|
-
behavior: Behavior
|
|
26
|
-
screenRoute: string,
|
|
27
|
-
screenStateStore: ScreenStateStore
|
|
18
|
+
behavior: Behavior
|
|
28
19
|
): BehaviorSubject<string[] | string> | null => {
|
|
29
20
|
if (!behavior) return null;
|
|
30
21
|
|
|
31
22
|
const selection = String(behavior.current_selection);
|
|
32
|
-
const screenKey = parseContextKey(selection, "screen");
|
|
33
|
-
|
|
34
|
-
if (screenKey) {
|
|
35
|
-
if (behavior.select_mode === "multi") {
|
|
36
|
-
return ScreenMultiSelectProvider.getProvider(
|
|
37
|
-
screenKey,
|
|
38
|
-
screenRoute,
|
|
39
|
-
screenStateStore
|
|
40
|
-
).getObservable();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (behavior.select_mode === "single") {
|
|
44
|
-
return ScreenSingleValueProvider.getProvider(
|
|
45
|
-
screenKey,
|
|
46
|
-
screenRoute,
|
|
47
|
-
screenStateStore
|
|
48
|
-
).getObservable();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
23
|
const contextKey = parseContextKey(selection);
|
|
53
24
|
|
|
54
25
|
if (contextKey) {
|
|
55
|
-
// TODO: Add storage scope to behavior
|
|
56
26
|
if (behavior.select_mode === "multi") {
|
|
57
27
|
return StorageMultiSelectProvider.getProvider(contextKey).getObservable();
|
|
58
28
|
}
|
|
@@ -71,8 +41,6 @@ const getDataSourceProvider = (
|
|
|
71
41
|
|
|
72
42
|
export const useBehaviorUpdate = (behavior: Behavior) => {
|
|
73
43
|
const [lastUpdate, setLastUpdate] = React.useState<number | null>(null);
|
|
74
|
-
const screenRoute = useRoute()?.pathname || "";
|
|
75
|
-
const screenStateStore = useScreenStateStore();
|
|
76
44
|
const player = usePlayer();
|
|
77
45
|
|
|
78
46
|
const triggerUpdate = () => setLastUpdate(Date.now());
|
|
@@ -80,11 +48,7 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
|
|
|
80
48
|
useEffect(() => {
|
|
81
49
|
if (!behavior) return;
|
|
82
50
|
|
|
83
|
-
const dataSource = getDataSourceProvider(
|
|
84
|
-
behavior,
|
|
85
|
-
screenRoute,
|
|
86
|
-
screenStateStore
|
|
87
|
-
);
|
|
51
|
+
const dataSource = getDataSourceProvider(behavior);
|
|
88
52
|
|
|
89
53
|
if (dataSource) {
|
|
90
54
|
const subscription = dataSource.subscribe(triggerUpdate);
|
|
@@ -108,17 +72,10 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
|
|
|
108
72
|
|
|
109
73
|
// We cant use async in this function (its inside render),
|
|
110
74
|
// so we rely on useBehaviorUpdate to update current value and trigger re-render
|
|
111
|
-
export const isCellSelected = (
|
|
112
|
-
item,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
behavior,
|
|
116
|
-
}: {
|
|
117
|
-
item: ZappEntry;
|
|
118
|
-
screenRoute: string;
|
|
119
|
-
screenStateStore: ScreenStateStore;
|
|
120
|
-
behavior?: Behavior;
|
|
121
|
-
}): boolean => {
|
|
75
|
+
export const isCellSelected = (
|
|
76
|
+
item: ZappEntry,
|
|
77
|
+
behavior?: Behavior
|
|
78
|
+
): boolean => {
|
|
122
79
|
if (!behavior) return false;
|
|
123
80
|
|
|
124
81
|
const id = behavior.selector ? get(item, behavior.selector) : item.id;
|
|
@@ -142,32 +99,7 @@ export const isCellSelected = ({
|
|
|
142
99
|
}
|
|
143
100
|
|
|
144
101
|
const selection = String(behavior.current_selection);
|
|
145
|
-
|
|
146
|
-
const screenKey = parseContextKey(selection, "screen");
|
|
147
|
-
|
|
148
|
-
if (screenKey) {
|
|
149
|
-
if (behavior.select_mode === "single") {
|
|
150
|
-
const selectedItem = ScreenSingleValueProvider.getProvider(
|
|
151
|
-
screenKey,
|
|
152
|
-
screenRoute,
|
|
153
|
-
screenStateStore
|
|
154
|
-
).getValue();
|
|
155
|
-
|
|
156
|
-
return selectedItem === String(id);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (behavior.select_mode === "multi") {
|
|
160
|
-
const selectedItems = ScreenMultiSelectProvider.getProvider(
|
|
161
|
-
screenKey,
|
|
162
|
-
screenRoute,
|
|
163
|
-
screenStateStore
|
|
164
|
-
).getSelectedItems();
|
|
165
|
-
|
|
166
|
-
return selectedItems?.includes(String(id));
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const contextKey = parseContextKey(selection, "ctx");
|
|
102
|
+
const contextKey = parseContextKey(selection);
|
|
171
103
|
|
|
172
104
|
if (contextKey) {
|
|
173
105
|
if (behavior.select_mode === "single") {
|
|
@@ -8,8 +8,6 @@ import { masterCellLogger } from "../logger";
|
|
|
8
8
|
import { getCellState } from "../../Cell/utils";
|
|
9
9
|
import { getColorFromData } from "@applicaster/zapp-react-native-utils/cellUtils";
|
|
10
10
|
import { isCellSelected, useBehaviorUpdate } from "./behaviorProvider";
|
|
11
|
-
import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
|
-
import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
|
|
13
11
|
|
|
14
12
|
const hasElementSpecificViewType = (viewType) => (element) => {
|
|
15
13
|
if (R.isNil(element)) {
|
|
@@ -192,18 +190,8 @@ export const getFocusedButtonId = (focusable) => {
|
|
|
192
190
|
});
|
|
193
191
|
};
|
|
194
192
|
|
|
195
|
-
export const isSelected = ({
|
|
196
|
-
item,
|
|
197
|
-
screenRoute,
|
|
198
|
-
screenStateStore,
|
|
199
|
-
behavior,
|
|
200
|
-
}: {
|
|
201
|
-
item: ZappEntry;
|
|
202
|
-
screenRoute: string;
|
|
203
|
-
screenStateStore: ScreenStateStore;
|
|
204
|
-
behavior?: Behavior;
|
|
205
|
-
}) => {
|
|
206
|
-
return isCellSelected({ item, screenRoute, screenStateStore, behavior });
|
|
193
|
+
export const isSelected = (item: ZappEntry, behavior?: Behavior) => {
|
|
194
|
+
return isCellSelected(item, behavior);
|
|
207
195
|
};
|
|
208
196
|
|
|
209
197
|
export const useCellState = ({
|
|
@@ -216,17 +204,9 @@ export const useCellState = ({
|
|
|
216
204
|
focused: boolean;
|
|
217
205
|
}): CellState => {
|
|
218
206
|
const lastUpdate = useBehaviorUpdate(behavior);
|
|
219
|
-
const router = useRoute();
|
|
220
|
-
const screenStateStore = useScreenStateStore();
|
|
221
207
|
|
|
222
208
|
const _isSelected = useMemo(
|
|
223
|
-
() =>
|
|
224
|
-
isSelected({
|
|
225
|
-
item,
|
|
226
|
-
screenRoute: router?.pathname,
|
|
227
|
-
screenStateStore,
|
|
228
|
-
behavior,
|
|
229
|
-
}),
|
|
209
|
+
() => isSelected(item, behavior),
|
|
230
210
|
[behavior, item, lastUpdate]
|
|
231
211
|
);
|
|
232
212
|
|
|
@@ -19,29 +19,27 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/utils", () => {
|
|
|
19
19
|
};
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
jest.mock(
|
|
23
|
-
"@applicaster/zapp-react-native-redux/hooks
|
|
24
|
-
() => ({
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}),
|
|
39
|
-
},
|
|
22
|
+
jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
|
|
23
|
+
...jest.requireActual("@applicaster/zapp-react-native-redux/hooks"),
|
|
24
|
+
usePickFromState: () => ({
|
|
25
|
+
plugins: [
|
|
26
|
+
{
|
|
27
|
+
name: "offline experience",
|
|
28
|
+
identifier: "offline-experience",
|
|
29
|
+
type: "general",
|
|
30
|
+
module: {
|
|
31
|
+
useOfflineExperienceConfiguration: () => ({
|
|
32
|
+
configurationFields: {},
|
|
33
|
+
localizations: {
|
|
34
|
+
offline_toast_message: "No internet connection",
|
|
35
|
+
online_toast_message: "You are back online",
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
40
38
|
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
})
|
|
44
|
-
);
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
}),
|
|
42
|
+
}));
|
|
45
43
|
|
|
46
44
|
jest.mock("react-native-safe-area-context", () => ({
|
|
47
45
|
useSafeAreaInsets: () => ({ top: 44 }),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
1
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
2
2
|
import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
3
3
|
import { styleKeys } from "@applicaster/zapp-react-native-utils/styleKeysUtils";
|
|
4
4
|
import { transformColorCode as fixColorHexCode } from "@applicaster/zapp-react-native-utils/transform";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
|
|
3
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
3
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
4
4
|
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
5
5
|
|
|
6
6
|
import { PlayerContainer as PlayerContainerComponent } from "./PlayerContainer";
|
|
@@ -10,11 +10,13 @@ import { useLocalizedStrings } from "@applicaster/zapp-react-native-utils/locali
|
|
|
10
10
|
import { useAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils";
|
|
11
11
|
import { useSendAnalyticsEventWithFunction } from "@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks";
|
|
12
12
|
import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useCurrentScreenData";
|
|
13
|
-
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
14
|
-
import { useDispatch } from "react-redux";
|
|
15
13
|
import { useShallow } from "zustand/react/shallow";
|
|
16
14
|
import { useScreenContextV2 } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
|
|
17
15
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
16
|
+
import {
|
|
17
|
+
ZappPipes,
|
|
18
|
+
useAppDispatch,
|
|
19
|
+
} from "@applicaster/zapp-react-native-redux";
|
|
18
20
|
|
|
19
21
|
const BRIGHTNESS_THRESHOLD = 160;
|
|
20
22
|
const ABOVE_DEFAULT_COLOR = "gray";
|
|
@@ -61,7 +63,7 @@ export const usePullToRefresh = (
|
|
|
61
63
|
) => {
|
|
62
64
|
const isPipesV1 = !!pullToRefreshPipesV1RefreshingStateUpdater;
|
|
63
65
|
|
|
64
|
-
const dispatch =
|
|
66
|
+
const dispatch = useAppDispatch();
|
|
65
67
|
|
|
66
68
|
const [refreshing, setRefreshing] = React.useState(false);
|
|
67
69
|
|
|
@@ -81,7 +83,7 @@ export const usePullToRefresh = (
|
|
|
81
83
|
if (refreshing && !isPipesV1) {
|
|
82
84
|
feeds.forEach((feed) => {
|
|
83
85
|
dispatch(
|
|
84
|
-
loadPipesData(feed, {
|
|
86
|
+
ZappPipes.loadPipesData(feed, {
|
|
85
87
|
silentRefresh: true,
|
|
86
88
|
clearCache: true,
|
|
87
89
|
callback: () => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
|
-
import { connectToStore } from "@applicaster/zapp-react-native-redux";
|
|
2
|
+
import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
|
|
3
3
|
|
|
4
4
|
import { withRiver } from "../../Decorators/RiverResolver";
|
|
5
5
|
import { withNavigator } from "../../Decorators/Navigator";
|
|
@@ -68,12 +68,33 @@ jest.mock(
|
|
|
68
68
|
})
|
|
69
69
|
);
|
|
70
70
|
|
|
71
|
+
jest.mock(
|
|
72
|
+
"@applicaster/zapp-react-native-utils/reactHooks/state/useRivers",
|
|
73
|
+
() => ({
|
|
74
|
+
useRivers: jest.fn(() => ({
|
|
75
|
+
rivers: [{ id: "testId", name: "Test River" }],
|
|
76
|
+
})),
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
|
|
71
80
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
72
81
|
isNavBarVisible: mockIsNavBarVisible,
|
|
73
82
|
useIsScreenActive: jest.fn().mockReturnValue(true),
|
|
83
|
+
useNavigation: jest.fn(() => ({
|
|
84
|
+
canGoBack: () => false,
|
|
85
|
+
currentRoute: "/river/testId",
|
|
86
|
+
activeRiver: { id: "testId" },
|
|
87
|
+
screenData: { id: "testId" },
|
|
88
|
+
data: { screen: { id: "testId" } },
|
|
89
|
+
})),
|
|
90
|
+
useRoute: jest.fn(() => ({
|
|
91
|
+
pathname: "/river/testId",
|
|
92
|
+
screenData: { id: "testId" },
|
|
93
|
+
})),
|
|
74
94
|
}));
|
|
75
95
|
|
|
76
96
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
97
|
+
...jest.requireActual("@applicaster/zapp-react-native-utils/reactHooks"),
|
|
77
98
|
useCurrentScreenData: jest.fn(() => ({
|
|
78
99
|
id: "testId",
|
|
79
100
|
})),
|
|
@@ -84,17 +105,6 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
|
84
105
|
id: "testId",
|
|
85
106
|
navigations: [{ id: "testId", category: "nav_bar" }],
|
|
86
107
|
})),
|
|
87
|
-
useNavigation: jest.fn(() => ({
|
|
88
|
-
canGoBack: () => false,
|
|
89
|
-
currentRoute: "/river/testId",
|
|
90
|
-
activeRiver: { id: "testId" },
|
|
91
|
-
screenData: { id: "testId" },
|
|
92
|
-
data: { screen: { id: "testId" } },
|
|
93
|
-
})),
|
|
94
|
-
useRoute: jest.fn(() => ({
|
|
95
|
-
pathname: "/river/testId",
|
|
96
|
-
screenData: { id: "testId" },
|
|
97
|
-
})),
|
|
98
108
|
useDimensions: jest.fn(() => ({
|
|
99
109
|
width: 1920,
|
|
100
110
|
height: 1080,
|
|
@@ -102,10 +112,11 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
|
102
112
|
useIsTablet: jest.fn(() => false),
|
|
103
113
|
}));
|
|
104
114
|
|
|
105
|
-
jest.mock("@applicaster/zapp-react-native-redux/hooks
|
|
115
|
+
jest.mock("@applicaster/zapp-react-native-redux/hooks", () => {
|
|
106
116
|
const View = jest.requireActual("react-native").View;
|
|
107
117
|
|
|
108
118
|
return {
|
|
119
|
+
...jest.requireActual("@applicaster/zapp-react-native-redux/hooks"),
|
|
109
120
|
usePickFromState: () => ({
|
|
110
121
|
plugins: [
|
|
111
122
|
{
|
|
@@ -36,7 +36,6 @@ export function CurrentScreenContextProvider({
|
|
|
36
36
|
screenData: NavigationScreenData;
|
|
37
37
|
}) {
|
|
38
38
|
const { pathname, isActive = false, screenData } = props;
|
|
39
|
-
console.log("CurrentScreenContextProvider", { screenData });
|
|
40
39
|
|
|
41
40
|
const [initialScreenData, setInitialScreenData] = React.useState(screenData);
|
|
42
41
|
|
|
@@ -11,8 +11,6 @@ export const withScreenDataContextProvider = (Component: any) => {
|
|
|
11
11
|
// use only initial activeRiver as this context should only be used for "Home", initial route
|
|
12
12
|
const screenData = React.useMemo(() => ({ screen: activeRiver }), []);
|
|
13
13
|
|
|
14
|
-
console.log("withScreenDataContextProvider", { screenData, activeRiver });
|
|
15
|
-
|
|
16
14
|
return (
|
|
17
15
|
<ScreenDataContext.Provider value={screenData}>
|
|
18
16
|
<Component {...props} />
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
loadDatasources,
|
|
14
14
|
usePipesContexts,
|
|
15
15
|
} from "./utils";
|
|
16
|
-
import { useScreenResolvers } from "@applicaster/zapp-react-native-utils/actionsExecutor/screenResolver";
|
|
17
16
|
|
|
18
17
|
type RiverProps = {
|
|
19
18
|
dispatch: DispatchProp;
|
|
@@ -26,7 +25,7 @@ export function WithRiverFeedLoader(Component: ZappComponent) {
|
|
|
26
25
|
return function WrappedWithRiverFeedLoader(props: RiverProps) {
|
|
27
26
|
const { river } = props;
|
|
28
27
|
const { screenData, pathname } = useRoute();
|
|
29
|
-
|
|
28
|
+
|
|
30
29
|
const pipesContexts = usePipesContexts(river.id, pathname);
|
|
31
30
|
|
|
32
31
|
const componentsToLoad = ignoreComponentsWithClearCacheFlag(
|
|
@@ -50,12 +49,7 @@ export function WithRiverFeedLoader(Component: ZappComponent) {
|
|
|
50
49
|
item?.filter((item2) => item2 !== undefined)
|
|
51
50
|
);
|
|
52
51
|
|
|
53
|
-
loadDatasources(
|
|
54
|
-
nonEmptyDataSources,
|
|
55
|
-
river?.id,
|
|
56
|
-
props.dispatch,
|
|
57
|
-
resolvers
|
|
58
|
-
);
|
|
52
|
+
loadDatasources(nonEmptyDataSources, river?.id, props.dispatch);
|
|
59
53
|
}, []);
|
|
60
54
|
|
|
61
55
|
return <Component {...props} />;
|
|
@@ -12,16 +12,11 @@ export { getDatasourceUrl } from "./getDatasourceUrl";
|
|
|
12
12
|
|
|
13
13
|
export const DATASOURCE_CHUNKS = 10;
|
|
14
14
|
|
|
15
|
-
export async function loadDatasources(
|
|
16
|
-
urls: string[][],
|
|
17
|
-
riverId,
|
|
18
|
-
dispatch,
|
|
19
|
-
resolvers
|
|
20
|
-
) {
|
|
15
|
+
export async function loadDatasources(urls: string[][], riverId, dispatch) {
|
|
21
16
|
return reducePromises<string, void>(
|
|
22
17
|
mapPromises<string, void>((url) => {
|
|
23
18
|
if (url) {
|
|
24
|
-
return dispatch(loadPipesData(url, { riverId
|
|
19
|
+
return dispatch(loadPipesData(url, { riverId }));
|
|
25
20
|
}
|
|
26
21
|
}),
|
|
27
22
|
undefined,
|
|
@@ -13,12 +13,9 @@ const rivers = {
|
|
|
13
13
|
},
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
jest.doMock(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
usePickFromState: jest.fn(() => ({ rivers })),
|
|
20
|
-
})
|
|
21
|
-
);
|
|
16
|
+
jest.doMock("@applicaster/zapp-react-native-redux/hooks", () => ({
|
|
17
|
+
usePickFromState: jest.fn(() => ({ rivers })),
|
|
18
|
+
}));
|
|
22
19
|
|
|
23
20
|
jest.doMock(
|
|
24
21
|
"@applicaster/zapp-react-native-utils/reactHooks/navigation/usePathname",
|
|
@@ -19,11 +19,7 @@ import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-compon
|
|
|
19
19
|
import { useScreenContext } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
|
|
20
20
|
|
|
21
21
|
import { isVerticalListOrGrid } from "./utils";
|
|
22
|
-
import {
|
|
23
|
-
subscribeForUrlContextKeyChanges,
|
|
24
|
-
subscribeForUrlScreenKeyChanges,
|
|
25
|
-
} from "@applicaster/zapp-pipes-v2-client";
|
|
26
|
-
import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
|
|
22
|
+
import { subscribeForUrlContextKeyChanges } from "@applicaster/zapp-pipes-v2-client";
|
|
27
23
|
|
|
28
24
|
type Props = {
|
|
29
25
|
component: ZappUIComponent;
|
|
@@ -208,9 +204,7 @@ export function zappPipesDataConnector(
|
|
|
208
204
|
Component: React.FC<any> | React.ComponentClass<any>
|
|
209
205
|
) {
|
|
210
206
|
return function WrappedWithZappPipesData(props: Props) {
|
|
211
|
-
const { screenData
|
|
212
|
-
const screenStateStore = useScreenStateStore();
|
|
213
|
-
|
|
207
|
+
const { screenData } = useRoute();
|
|
214
208
|
const { plugins } = usePickFromState(["plugins"]);
|
|
215
209
|
|
|
216
210
|
const screenContextData = useScreenContext();
|
|
@@ -292,18 +286,6 @@ export function zappPipesDataConnector(
|
|
|
292
286
|
componentIndex
|
|
293
287
|
);
|
|
294
288
|
|
|
295
|
-
useEffect(() => {
|
|
296
|
-
if (!(dataSourceUrl?.includes("pipesv2://") && reloadData)) {
|
|
297
|
-
return subscribeForUrlScreenKeyChanges(
|
|
298
|
-
dataSourceUrl,
|
|
299
|
-
pathname,
|
|
300
|
-
screenStateStore,
|
|
301
|
-
{},
|
|
302
|
-
reloadData
|
|
303
|
-
);
|
|
304
|
-
}
|
|
305
|
-
}, [dataSourceUrl, reloadData]);
|
|
306
|
-
|
|
307
289
|
useEffect(() => {
|
|
308
290
|
if (dataSourceUrl?.includes("pipesv2://") && reloadData) {
|
|
309
291
|
const addListener = getListenerFromPlugin(dataSourceUrl, plugins);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-ui-components",
|
|
3
|
-
"version": "14.0.0-alpha.
|
|
3
|
+
"version": "14.0.0-alpha.3471443312",
|
|
4
4
|
"description": "Applicaster Zapp React Native ui components for the Quick Brick App",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"redux-mock-store": "^1.5.3"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@applicaster/applicaster-types": "14.0.0-alpha.
|
|
35
|
-
"@applicaster/zapp-react-native-bridge": "14.0.0-alpha.
|
|
36
|
-
"@applicaster/zapp-react-native-redux": "14.0.0-alpha.
|
|
37
|
-
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.
|
|
34
|
+
"@applicaster/applicaster-types": "14.0.0-alpha.3471443312",
|
|
35
|
+
"@applicaster/zapp-react-native-bridge": "14.0.0-alpha.3471443312",
|
|
36
|
+
"@applicaster/zapp-react-native-redux": "14.0.0-alpha.3471443312",
|
|
37
|
+
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.3471443312",
|
|
38
38
|
"promise": "^8.3.0",
|
|
39
39
|
"url": "^0.11.0",
|
|
40
40
|
"uuid": "^3.3.2"
|