@applicaster/zapp-react-native-utils 14.0.0-alpha.4011674803 → 14.0.0-alpha.4552519200
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/analyticsUtils/AnalyticsEvents/sendHeaderClickEvent.ts +1 -1
- package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -1
- package/analyticsUtils/index.tsx +3 -4
- package/analyticsUtils/manager.ts +1 -1
- package/arrayUtils/__tests__/isEmptyArray.test.ts +63 -0
- package/arrayUtils/__tests__/isFilledArray.test.ts +1 -1
- package/arrayUtils/index.ts +7 -2
- package/audioPlayerUtils/__tests__/getImageFromEntry.test.ts +54 -0
- package/audioPlayerUtils/index.ts +135 -22
- package/conf/player/__tests__/selectors.test.ts +34 -0
- package/conf/player/selectors.ts +10 -0
- package/configurationUtils/__tests__/configurationUtils.test.js +0 -31
- package/configurationUtils/__tests__/getMediaItems.test.ts +65 -0
- package/configurationUtils/__tests__/imageSrcFromMediaItem.test.ts +34 -0
- package/configurationUtils/index.ts +63 -34
- package/manifestUtils/_internals/getDefaultConfiguration.js +28 -0
- package/manifestUtils/{_internals.js → _internals/index.js} +2 -25
- package/manifestUtils/createConfig.js +4 -1
- package/manifestUtils/defaultManifestConfigurations/player.js +1231 -200
- package/manifestUtils/progressBar/__tests__/mobileProgressBar.test.js +0 -30
- package/package.json +2 -2
- package/playerUtils/__tests__/configurationUtils.test.ts +1 -65
- package/playerUtils/__tests__/getPlayerActionButtons.test.ts +54 -0
- package/playerUtils/_internals/__tests__/utils.test.ts +71 -0
- package/playerUtils/_internals/index.ts +1 -0
- package/playerUtils/_internals/utils.ts +31 -0
- package/playerUtils/configurationUtils.ts +0 -44
- package/playerUtils/getPlayerActionButtons.ts +17 -0
- package/playerUtils/index.ts +2 -0
- package/playerUtils/useValidatePlayerConfig.tsx +22 -19
- package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +12 -13
- package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +39 -88
- package/reactHooks/feed/useBatchLoading.ts +2 -2
- package/reactHooks/navigation/index.ts +2 -2
- package/testUtils/index.tsx +7 -8
- package/utils/index.ts +4 -2
- package/playerUtils/configurationGenerator.ts +0 -2572
- package/utils/isPresent.ts +0 -4
|
@@ -4,7 +4,7 @@ import { postAnalyticEvent } from "../manager";
|
|
|
4
4
|
import { ANALYTICS_CORE_EVENTS } from "../events";
|
|
5
5
|
|
|
6
6
|
type SendHeaderClickEventProps = {
|
|
7
|
-
extraProps:
|
|
7
|
+
extraProps: Record<string, any>;
|
|
8
8
|
component?: ZappUIComponent;
|
|
9
9
|
zappPipesData?: ZappPipesData;
|
|
10
10
|
item?: ZappEntry;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
/// <reference types="../../" />
|
|
1
2
|
import { log_error, log_debug } from "../logger";
|
|
2
3
|
import { replaceAnalyticsPropsNils } from "./helper";
|
|
3
4
|
import { postAnalyticEvent } from "../manager";
|
|
4
5
|
|
|
5
6
|
import { ANALYTICS_CORE_EVENTS } from "../events";
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
type AnalyticsDefaultHelperProperties = {
|
|
8
9
|
analyticsScreenData: AnalyticsScreenProperties;
|
|
9
10
|
extraProps: any;
|
|
10
11
|
props;
|
package/analyticsUtils/index.tsx
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="@applicaster/zapp-react-native-utils" />
|
|
2
1
|
import * as R from "ramda";
|
|
3
2
|
import * as React from "react";
|
|
4
3
|
import { isWeb } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
@@ -31,7 +30,7 @@ import { ANALYTICS_CORE_EVENTS } from "./events";
|
|
|
31
30
|
import { noop } from "../functionUtils";
|
|
32
31
|
|
|
33
32
|
type ComponentWithChildrenProps = {
|
|
34
|
-
children: React.
|
|
33
|
+
children: React.ReactElement;
|
|
35
34
|
};
|
|
36
35
|
|
|
37
36
|
export function sendSelectCellEvent(item, component, headerTitle, itemIndex) {
|
|
@@ -120,11 +119,11 @@ export function getAnalyticsFunctions({
|
|
|
120
119
|
export const AnalyticsContext =
|
|
121
120
|
React.createContext<GetAnalyticsFunctions>(noop);
|
|
122
121
|
|
|
123
|
-
export function AnalyticsProvider(
|
|
122
|
+
export function AnalyticsProvider({ children }: ComponentWithChildrenProps) {
|
|
124
123
|
return (
|
|
125
124
|
// @ts-ignore - this is a valid context provider
|
|
126
125
|
<AnalyticsContext.Provider value={getAnalyticsFunctions}>
|
|
127
|
-
{
|
|
126
|
+
{children}
|
|
128
127
|
</AnalyticsContext.Provider>
|
|
129
128
|
);
|
|
130
129
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
2
2
|
import * as R from "ramda";
|
|
3
3
|
import { NativeModules } from "react-native";
|
|
4
|
-
import { ANALYTICS_CORE_EVENTS } from "
|
|
4
|
+
import { ANALYTICS_CORE_EVENTS } from "./events";
|
|
5
5
|
|
|
6
6
|
import { analyticsUtilsLogger } from "./logger";
|
|
7
7
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { isEmptyArray } from "..";
|
|
2
|
+
|
|
3
|
+
describe("isEmptyArray", () => {
|
|
4
|
+
it("non-empty array is not empty", () => {
|
|
5
|
+
const value = [1, 2, 3];
|
|
6
|
+
|
|
7
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("empty array is empty", () => {
|
|
11
|
+
const value = [];
|
|
12
|
+
|
|
13
|
+
expect(isEmptyArray(value)).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("number is not array", () => {
|
|
17
|
+
const value = 123;
|
|
18
|
+
|
|
19
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("string is not array", () => {
|
|
23
|
+
const value = "vfnjdk";
|
|
24
|
+
|
|
25
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("empty string is not array", () => {
|
|
29
|
+
const value = "";
|
|
30
|
+
|
|
31
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("NaN is not array", () => {
|
|
35
|
+
const value = NaN;
|
|
36
|
+
|
|
37
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("object is not array", () => {
|
|
41
|
+
const value = { test: 1 };
|
|
42
|
+
|
|
43
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("empty object is not array", () => {
|
|
47
|
+
const value = {};
|
|
48
|
+
|
|
49
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("undefined is not array", () => {
|
|
53
|
+
const value = undefined;
|
|
54
|
+
|
|
55
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("null is not array", () => {
|
|
59
|
+
const value = null;
|
|
60
|
+
|
|
61
|
+
expect(isEmptyArray(value)).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
});
|
package/arrayUtils/index.ts
CHANGED
|
@@ -99,12 +99,17 @@ export const makeListOf = (value: unknown, size: number): number[] => {
|
|
|
99
99
|
|
|
100
100
|
/** Checks if a value is a non-empty array */
|
|
101
101
|
export function isFilledArray(value: unknown): boolean {
|
|
102
|
-
return
|
|
102
|
+
return Array.isArray(value) && value.length > 0;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Checks if a value is a empty array */
|
|
106
|
+
export function isEmptyArray(value: unknown): boolean {
|
|
107
|
+
return Array.isArray(value) && value.length === 0;
|
|
103
108
|
}
|
|
104
109
|
|
|
105
110
|
// get random item from the list
|
|
106
111
|
export const sample = (xs: unknown[]): unknown => {
|
|
107
|
-
invariant(
|
|
112
|
+
invariant(Array.isArray(xs), `input value is not an array: ${xs}`);
|
|
108
113
|
invariant(isFilledArray(xs), `input array is empty: ${xs}`);
|
|
109
114
|
|
|
110
115
|
const index = Math.floor(Math.random() * xs.length);
|
|
@@ -53,4 +53,58 @@ describe("getImageFromEntry", () => {
|
|
|
53
53
|
|
|
54
54
|
expect(result).toBeUndefined();
|
|
55
55
|
});
|
|
56
|
+
|
|
57
|
+
it("returns undefined for non string src", () => {
|
|
58
|
+
const entryWithNonStringSrc = {
|
|
59
|
+
media_group: [
|
|
60
|
+
{
|
|
61
|
+
media_item: [
|
|
62
|
+
{
|
|
63
|
+
key: "image_base_key",
|
|
64
|
+
src: 123,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
key: "thumb_1",
|
|
68
|
+
src: null,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
type: "image",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const result = getImageFromEntry({
|
|
77
|
+
entry: entryWithNonStringSrc,
|
|
78
|
+
imageKey: "image_base_key",
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
expect(result).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("returns undefined for empty src", () => {
|
|
85
|
+
const entryWithEmptySrc = {
|
|
86
|
+
media_group: [
|
|
87
|
+
{
|
|
88
|
+
media_item: [
|
|
89
|
+
{
|
|
90
|
+
key: "image_base_key",
|
|
91
|
+
src: "",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
key: "thumb_1",
|
|
95
|
+
src: null,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
type: "image",
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const result = getImageFromEntry({
|
|
104
|
+
entry: entryWithEmptySrc,
|
|
105
|
+
imageKey: "image_base_key",
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
expect(result).toBeUndefined();
|
|
109
|
+
});
|
|
56
110
|
});
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { get, has } from "@applicaster/zapp-react-native-utils/utils";
|
|
3
|
+
import { useZStore } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
4
|
+
import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
|
|
5
|
+
|
|
6
|
+
import { isNotEmptyString } from "@applicaster/zapp-react-native-utils/stringUtils";
|
|
7
|
+
import { getMediaItems } from "@applicaster/zapp-react-native-utils/configurationUtils";
|
|
2
8
|
|
|
3
9
|
import { DEFAULT_IMAGE } from "./assets";
|
|
4
10
|
|
|
@@ -9,20 +15,9 @@ export function getImageFromEntry({
|
|
|
9
15
|
entry: ZappEntry;
|
|
10
16
|
imageKey: Option<string>;
|
|
11
17
|
}): Option<string> {
|
|
12
|
-
const
|
|
18
|
+
const mediaItems = getMediaItems(entry);
|
|
13
19
|
|
|
14
|
-
if (!
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Find all media_items from groups of type 'image'
|
|
19
|
-
const mediaItems = mediaGroup
|
|
20
|
-
.filter((group) => group.type === "image")
|
|
21
|
-
.flatMap((group) =>
|
|
22
|
-
Array.isArray(group.media_item) ? group.media_item : [group.media_item]
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
if (!Array.isArray(mediaItems) || mediaItems.length === 0) {
|
|
20
|
+
if (!mediaItems) {
|
|
26
21
|
return undefined;
|
|
27
22
|
}
|
|
28
23
|
|
|
@@ -31,15 +26,28 @@ export function getImageFromEntry({
|
|
|
31
26
|
const src = found?.src;
|
|
32
27
|
|
|
33
28
|
// Special case for react native - uri cannot be an empty string (yellow warning).
|
|
34
|
-
return
|
|
29
|
+
return isNotEmptyString(src) ? src : undefined;
|
|
35
30
|
}
|
|
36
31
|
|
|
37
|
-
const getPropertyFromExtensions = (
|
|
32
|
+
const getPropertyFromExtensions = (
|
|
33
|
+
key: string,
|
|
34
|
+
entry: ZappEntry
|
|
35
|
+
): Option<string> => entry?.extensions?.[key];
|
|
38
36
|
|
|
39
|
-
const getPropertyFromConfiguration = (
|
|
40
|
-
|
|
37
|
+
const getPropertyFromConfiguration = (
|
|
38
|
+
key: string,
|
|
39
|
+
plugin_configuration: Record<string, any>
|
|
40
|
+
) => plugin_configuration?.[key];
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
type GetBackgroundImageParams = {
|
|
43
|
+
entry: ZappEntry;
|
|
44
|
+
plugin_configuration: Record<string, any>;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const getBackgroundImage = ({
|
|
48
|
+
entry,
|
|
49
|
+
plugin_configuration,
|
|
50
|
+
}: GetBackgroundImageParams): string => {
|
|
43
51
|
// 1) image_key from extensions
|
|
44
52
|
const imageKeyFromExtensions = getPropertyFromExtensions("image_key", entry);
|
|
45
53
|
|
|
@@ -58,7 +66,7 @@ export const getBackgroundImage = ({ entry, plugin_configuration }): string => {
|
|
|
58
66
|
entry
|
|
59
67
|
);
|
|
60
68
|
|
|
61
|
-
if (audioPlayerBackgroundImageFromExtensions) {
|
|
69
|
+
if (isNotEmptyString(audioPlayerBackgroundImageFromExtensions)) {
|
|
62
70
|
return audioPlayerBackgroundImageFromExtensions;
|
|
63
71
|
}
|
|
64
72
|
|
|
@@ -84,7 +92,7 @@ export const getBackgroundImage = ({ entry, plugin_configuration }): string => {
|
|
|
84
92
|
plugin_configuration
|
|
85
93
|
);
|
|
86
94
|
|
|
87
|
-
if (audioPlayerBackgroundImageFromConfiguration) {
|
|
95
|
+
if (isNotEmptyString(audioPlayerBackgroundImageFromConfiguration)) {
|
|
88
96
|
return audioPlayerBackgroundImageFromConfiguration;
|
|
89
97
|
}
|
|
90
98
|
|
|
@@ -92,11 +100,17 @@ export const getBackgroundImage = ({ entry, plugin_configuration }): string => {
|
|
|
92
100
|
return DEFAULT_IMAGE;
|
|
93
101
|
};
|
|
94
102
|
|
|
103
|
+
type GetArtworkImageParams = {
|
|
104
|
+
key: string;
|
|
105
|
+
entry: ZappEntry;
|
|
106
|
+
plugin_configuration: Record<string, any>;
|
|
107
|
+
};
|
|
108
|
+
|
|
95
109
|
export const getArtworkImage = ({
|
|
96
110
|
key,
|
|
97
111
|
entry,
|
|
98
112
|
plugin_configuration,
|
|
99
|
-
}): string => {
|
|
113
|
+
}: GetArtworkImageParams): string => {
|
|
100
114
|
// 1) image_key from extensions
|
|
101
115
|
const imageKeyFromExtensions = getPropertyFromExtensions(key, entry);
|
|
102
116
|
|
|
@@ -127,3 +141,102 @@ export const getArtworkImage = ({
|
|
|
127
141
|
// default image
|
|
128
142
|
return DEFAULT_IMAGE;
|
|
129
143
|
};
|
|
144
|
+
|
|
145
|
+
const useAdjustedKeyFromScreenData = ({ config, keys }) => {
|
|
146
|
+
const { screenData } = useRoute();
|
|
147
|
+
|
|
148
|
+
const adjustedConfig = { ...config };
|
|
149
|
+
|
|
150
|
+
keys.forEach((key) => {
|
|
151
|
+
const path = ["targetScreen", "styles", key];
|
|
152
|
+
|
|
153
|
+
if (has(screenData, path)) {
|
|
154
|
+
const value = get(screenData, path);
|
|
155
|
+
|
|
156
|
+
adjustedConfig[key] = value;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
return adjustedConfig;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const AUDIO_PLAYER_ARTWORK_IMAGE_KEY = "audio_player_artwork_image_key";
|
|
164
|
+
|
|
165
|
+
const audioPlayerArtworkImageKeySelector = (config) =>
|
|
166
|
+
config?.[AUDIO_PLAYER_ARTWORK_IMAGE_KEY];
|
|
167
|
+
|
|
168
|
+
export const useArtworkImage = (entry: ZappEntry): string => {
|
|
169
|
+
const configuration = useZStore("playerConfiguration");
|
|
170
|
+
|
|
171
|
+
const audio_player_artwork_image_key_value = configuration(
|
|
172
|
+
audioPlayerArtworkImageKeySelector
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
const pluginConfiguration = React.useMemo(
|
|
176
|
+
() => ({
|
|
177
|
+
audio_player_artwork_image_key: audio_player_artwork_image_key_value,
|
|
178
|
+
}),
|
|
179
|
+
[audio_player_artwork_image_key_value]
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
// HACK: for override [key] from screenData, because we treat empty string value as missing key and replace it to initial_value from manifest(which is wrong)
|
|
183
|
+
const adjustedPluginConfiguration = useAdjustedKeyFromScreenData({
|
|
184
|
+
keys: [AUDIO_PLAYER_ARTWORK_IMAGE_KEY],
|
|
185
|
+
config: pluginConfiguration,
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
return React.useMemo(
|
|
189
|
+
() =>
|
|
190
|
+
getArtworkImage({
|
|
191
|
+
key: AUDIO_PLAYER_ARTWORK_IMAGE_KEY,
|
|
192
|
+
entry,
|
|
193
|
+
plugin_configuration: adjustedPluginConfiguration,
|
|
194
|
+
}),
|
|
195
|
+
[]
|
|
196
|
+
);
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const AUDIO_PLAYER_IMAGE_KEY = "audio_player_image_key";
|
|
200
|
+
const AUDIO_PLAYER_BACKGROUND_IMAGE = "audio_player_background_image";
|
|
201
|
+
|
|
202
|
+
const audioPlayerImageKeySelector = (config) =>
|
|
203
|
+
config?.[AUDIO_PLAYER_IMAGE_KEY];
|
|
204
|
+
|
|
205
|
+
const audioPlayerBackgroundImageSelector = (config) =>
|
|
206
|
+
config?.[AUDIO_PLAYER_BACKGROUND_IMAGE];
|
|
207
|
+
|
|
208
|
+
export const useBackgroundImage = (entry: ZappEntry): { uri: string } => {
|
|
209
|
+
const configuration = useZStore("playerConfiguration");
|
|
210
|
+
|
|
211
|
+
const audio_player_image_key_value = configuration(
|
|
212
|
+
audioPlayerImageKeySelector
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
const audio_player_background_image_value = configuration(
|
|
216
|
+
audioPlayerBackgroundImageSelector
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
const pluginConfiguration = React.useMemo(
|
|
220
|
+
() => ({
|
|
221
|
+
audio_player_image_key: audio_player_image_key_value,
|
|
222
|
+
audio_player_background_image: audio_player_background_image_value,
|
|
223
|
+
}),
|
|
224
|
+
[audio_player_image_key_value, audio_player_background_image_value]
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
// HACK: for override [key] from screenData, because we treat empty string value as missing key and replace it to initial_value from manifest(which is wrong)
|
|
228
|
+
const adjustedPluginConfiguration = useAdjustedKeyFromScreenData({
|
|
229
|
+
keys: [AUDIO_PLAYER_IMAGE_KEY, AUDIO_PLAYER_BACKGROUND_IMAGE],
|
|
230
|
+
config: pluginConfiguration,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
return React.useMemo(
|
|
234
|
+
() => ({
|
|
235
|
+
uri: getBackgroundImage({
|
|
236
|
+
entry,
|
|
237
|
+
plugin_configuration: adjustedPluginConfiguration,
|
|
238
|
+
}),
|
|
239
|
+
}),
|
|
240
|
+
[entry, adjustedPluginConfiguration]
|
|
241
|
+
);
|
|
242
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { selectActionButtons } from "@applicaster/zapp-react-native-utils/conf/player/selectors";
|
|
2
|
+
|
|
3
|
+
describe("selectActionButtons", () => {
|
|
4
|
+
it("returns the player_action_buttons array if present", () => {
|
|
5
|
+
const pluginConf = {
|
|
6
|
+
player_action_buttons: [
|
|
7
|
+
{ id: "like", label: "Like" },
|
|
8
|
+
{ id: "share", label: "Share" },
|
|
9
|
+
],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
expect(selectActionButtons(pluginConf)).toEqual(
|
|
13
|
+
pluginConf.player_action_buttons
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("returns null if player_action_buttons is not present", () => {
|
|
18
|
+
const pluginConf = { some_other_key: [] };
|
|
19
|
+
expect(selectActionButtons(pluginConf)).toBeNull();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("returns null if pluginConf is undefined", () => {
|
|
23
|
+
expect(selectActionButtons(undefined)).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("returns null if pluginConf is null", () => {
|
|
27
|
+
expect(selectActionButtons(null)).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("returns null if player_action_buttons is explicitly set to null", () => {
|
|
31
|
+
const pluginConf = { player_action_buttons: null };
|
|
32
|
+
expect(selectActionButtons(pluginConf)).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { get } from "@applicaster/zapp-react-native-utils/utils";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Selects the action buttons from the player configuration.
|
|
5
|
+
* @param {Object} pluginConf - player plugin config
|
|
6
|
+
* @returns {Array|null} An array of action buttons or null if not found.
|
|
7
|
+
*/
|
|
8
|
+
export const selectActionButtons = (pluginConf: any) => {
|
|
9
|
+
return get(pluginConf, "player_action_buttons", null);
|
|
10
|
+
};
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import * as R from "ramda";
|
|
2
1
|
import {
|
|
3
2
|
populateConfigurationValues,
|
|
4
|
-
imageSrcFromMediaItem,
|
|
5
3
|
getBoolFromConfigValue,
|
|
6
4
|
remapUpdatedKeys,
|
|
7
5
|
} from "../";
|
|
8
|
-
import { entry } from "./testEntry";
|
|
9
6
|
|
|
10
7
|
describe("getBoolFromConfigValue", () => {
|
|
11
8
|
it('returns true if value is "true" string', () => {
|
|
@@ -57,34 +54,6 @@ describe("getBoolFromConfigValue", () => {
|
|
|
57
54
|
});
|
|
58
55
|
});
|
|
59
56
|
|
|
60
|
-
describe("imageSrcFromMediaItem", () => {
|
|
61
|
-
describe("returns the src value of first media_item", () => {
|
|
62
|
-
it("when the matching key is found and the src is not empty", () => {
|
|
63
|
-
const result = imageSrcFromMediaItem(entry, ["logo_thumbnail"]);
|
|
64
|
-
|
|
65
|
-
expect(result).toEqual(entry.media_group[1].media_item[0].src);
|
|
66
|
-
expect(result).not.toEqual("");
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("returns a media item with the 'image_base' key as a fallback", () => {
|
|
71
|
-
const result = imageSrcFromMediaItem(entry, ["does_not_exist"]);
|
|
72
|
-
const fallback = entry.media_group[0].media_item[0];
|
|
73
|
-
expect(result).toEqual(fallback.src);
|
|
74
|
-
expect(fallback.key).toBe("image_base");
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it("returns undefined if the key was found but the source was empty", () => {
|
|
78
|
-
const badEntry = R.set(
|
|
79
|
-
R.lensPath(["media_group", 0, "media_item", 0, "src"]),
|
|
80
|
-
"",
|
|
81
|
-
entry
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
expect(imageSrcFromMediaItem(badEntry, ["image_base"])).toBeUndefined();
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
57
|
describe("populateConfigurationValues", () => {
|
|
89
58
|
it("transforms and returns the valid values", () => {
|
|
90
59
|
const fields = [
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getMediaItems } from "..";
|
|
2
|
+
import { entry as baseEntry } from "./testEntry";
|
|
3
|
+
|
|
4
|
+
describe("getMediaItems", () => {
|
|
5
|
+
it("returns both image and thumbnail media items", () => {
|
|
6
|
+
const items = getMediaItems(baseEntry);
|
|
7
|
+
expect(items).toHaveLength(2);
|
|
8
|
+
expect(items[0].key).toBe("image_base");
|
|
9
|
+
expect(items[1].key).toBe("logo_thumbnail");
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("returns only image media items if no thumbnail present", () => {
|
|
13
|
+
const entry = {
|
|
14
|
+
...baseEntry,
|
|
15
|
+
media_group: [
|
|
16
|
+
{
|
|
17
|
+
type: "image",
|
|
18
|
+
media_item: [
|
|
19
|
+
{ key: "image_base", src: "img.png" },
|
|
20
|
+
{ key: "other", src: "other.png" },
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const items = getMediaItems(entry);
|
|
27
|
+
expect(items).toHaveLength(2);
|
|
28
|
+
expect(items[0].key).toBe("image_base");
|
|
29
|
+
expect(items[1].key).toBe("other");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("returns only thumbnail media items if no image present", () => {
|
|
33
|
+
const entry = {
|
|
34
|
+
...baseEntry,
|
|
35
|
+
media_group: [
|
|
36
|
+
{
|
|
37
|
+
type: "thumbnail",
|
|
38
|
+
media_item: [{ key: "thumb1", src: "thumb1.png" }],
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const items = getMediaItems(entry);
|
|
44
|
+
expect(items).toHaveLength(1);
|
|
45
|
+
expect(items[0].key).toBe("thumb1");
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("returns undefined if no media_group present", () => {
|
|
49
|
+
const entry = { ...baseEntry };
|
|
50
|
+
delete entry.media_group;
|
|
51
|
+
expect(getMediaItems(entry)).toBeUndefined();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("returns undefined if media_group is present but has no image or thumbnail", () => {
|
|
55
|
+
const entry = {
|
|
56
|
+
...baseEntry,
|
|
57
|
+
media_group: [
|
|
58
|
+
{ type: "audio", media_item: [{ key: "audio1", src: "audio1.mp3" }] },
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const items = getMediaItems(entry);
|
|
63
|
+
expect(items).toBeUndefined();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as R from "ramda";
|
|
2
|
+
import { imageSrcFromMediaItem } from "../";
|
|
3
|
+
import { entry } from "./testEntry";
|
|
4
|
+
|
|
5
|
+
describe("imageSrcFromMediaItem", () => {
|
|
6
|
+
it("when the matching key is found and the src is not empty", () => {
|
|
7
|
+
const result = imageSrcFromMediaItem(entry as ZappEntry, [
|
|
8
|
+
"logo_thumbnail",
|
|
9
|
+
]);
|
|
10
|
+
|
|
11
|
+
expect(result).toEqual(entry.media_group[1].media_item[0].src);
|
|
12
|
+
expect(result).not.toEqual("");
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("returns a media item with the 'image_base' key as a fallback", () => {
|
|
16
|
+
const result = imageSrcFromMediaItem(entry as ZappEntry, [
|
|
17
|
+
"does_not_exist",
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
const fallback = entry.media_group[0].media_item[0];
|
|
21
|
+
expect(result).toEqual(fallback.src);
|
|
22
|
+
expect(fallback.key).toBe("image_base");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("returns undefined if the key was found but the source was empty", () => {
|
|
26
|
+
const badEntry: ZappEntry = R.set(
|
|
27
|
+
R.lensPath(["media_group", 0, "media_item", 0, "src"]),
|
|
28
|
+
"",
|
|
29
|
+
entry
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
expect(imageSrcFromMediaItem(badEntry, ["image_base"])).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
});
|