@applicaster/zapp-react-native-utils 12.0.0-alpha.5114122134 → 12.0.0-alpha.5251355865
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 +16 -8
- package/analyticsUtils/__tests__/analyticsManager.test.js +75 -73
- package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +1 -1
- package/appUtils/keyCodes/__tests__/keyCodes.test.js +80 -85
- package/appUtils/keyCodes/keys.web.js +1 -0
- package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +53 -0
- package/appUtils/playerManager/player.ts +12 -4
- package/appUtils/playerManager/playerFactory.ts +13 -1
- package/appUtils/playerManager/playerNative.ts +26 -0
- package/appUtils/playerManager/usePlayerState.tsx +13 -1
- package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +50 -0
- package/cellUtils/__tests__/cellUtils.test.ts +59 -0
- package/cellUtils/__tests__/fixtures.ts +13 -0
- package/cellUtils/index.ts +42 -0
- package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +2 -2
- package/functionUtils/__tests__/functionUtils.test.js +244 -248
- package/localizationUtils/__tests__/localizationUtils.test.ts +17 -13
- package/manifestUtils/defaultManifestConfigurations/player.js +8 -0
- package/modalState/index.ts +57 -0
- package/navigationUtils/index.ts +56 -7
- package/package.json +3 -2
- package/playerUtils/configurationGenerator.ts +8 -0
- package/pluginUtils/index.ts +11 -7
- package/reactHooks/cell-click/__tests__/index.test.js +6 -2
- package/reactHooks/cell-click/index.ts +2 -2
- package/reactHooks/index.ts +2 -0
- package/reactHooks/layout/__tests__/index.test.js +22 -30
- package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +11 -16
- package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +12 -14
- package/reactHooks/navigation/__mocks__/useNavigation.ts +4 -0
- package/reactHooks/navigation/__tests__/index.test.tsx +234 -78
- package/reactHooks/navigation/index.ts +201 -85
- package/reactHooks/screen/__mocks__/useScreenContext.ts +3 -1
- package/reactHooks/screen/index.ts +2 -0
- package/reactHooks/screen/useScreenContext.ts +1 -1
- package/reactHooks/useListenEventBusEvent.ts +1 -4
- package/screenState/index.ts +8 -0
- package/testUtils/index.tsx +15 -2
|
@@ -9,6 +9,7 @@ type PlayerState = {
|
|
|
9
9
|
isLive: boolean;
|
|
10
10
|
isPaused: boolean;
|
|
11
11
|
isBuffering: boolean;
|
|
12
|
+
isReadyToPlay: boolean;
|
|
12
13
|
};
|
|
13
14
|
|
|
14
15
|
export const usePlayerState = (
|
|
@@ -20,12 +21,14 @@ export const usePlayerState = (
|
|
|
20
21
|
const [seekableDuration, setSeekableDuration] = React.useState<number>(null);
|
|
21
22
|
const [isLive, setIsLive] = React.useState<boolean>(null);
|
|
22
23
|
const [isBuffering, setIsBuffering] = React.useState<boolean>(false);
|
|
24
|
+
const [isReadyToPlay, setIsReadyToPlay] = React.useState<boolean>(false);
|
|
23
25
|
const [isPaused, setIsPaused] = React.useState<boolean>(false);
|
|
24
26
|
|
|
25
27
|
const player: Player = usePlayer(playerId);
|
|
26
28
|
|
|
27
29
|
const onPlayerChangeState = React.useCallback(() => {
|
|
28
30
|
setIsBuffering(player.isBuffering());
|
|
31
|
+
setIsReadyToPlay(player.isReadyToPlay);
|
|
29
32
|
setCurrentTime(player.getContentPosition());
|
|
30
33
|
setDuration(player.getDuration());
|
|
31
34
|
setSeekableDuration(player.getSeekableDuration());
|
|
@@ -60,7 +63,16 @@ export const usePlayerState = (
|
|
|
60
63
|
isLive,
|
|
61
64
|
isPaused,
|
|
62
65
|
isBuffering,
|
|
66
|
+
isReadyToPlay,
|
|
63
67
|
}),
|
|
64
|
-
[
|
|
68
|
+
[
|
|
69
|
+
currentTime,
|
|
70
|
+
duration,
|
|
71
|
+
seekableDuration,
|
|
72
|
+
isLive,
|
|
73
|
+
isPaused,
|
|
74
|
+
isBuffering,
|
|
75
|
+
isReadyToPlay,
|
|
76
|
+
]
|
|
65
77
|
);
|
|
66
78
|
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { OverlaysObserver } from "./OverlayObserver/OverlaysObserver";
|
|
3
|
+
import { useFeedLoader } from "../../reactHooks";
|
|
4
|
+
import { usePlayer } from "./usePlayer";
|
|
5
|
+
|
|
6
|
+
export const useTitleSummaryOverlay = (
|
|
7
|
+
feedUrl,
|
|
8
|
+
entry,
|
|
9
|
+
isLive = false,
|
|
10
|
+
interval: number
|
|
11
|
+
) => {
|
|
12
|
+
const player = usePlayer();
|
|
13
|
+
const [title, setTitle] = useState<string | number>(entry?.title || "");
|
|
14
|
+
const [summary, setSummary] = useState<string | number>(entry?.summary || "");
|
|
15
|
+
|
|
16
|
+
// Hook to load feed data
|
|
17
|
+
const { data: feedData, reloadData } = useFeedLoader({ feedUrl });
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (player && feedUrl && isLive) {
|
|
21
|
+
const observer = new OverlaysObserver({ player });
|
|
22
|
+
|
|
23
|
+
observer.setFeedDataHandlers(feedUrl, reloadData, interval, (entry) => {
|
|
24
|
+
setTitle(entry?.title || "");
|
|
25
|
+
setSummary(entry?.summary || "");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const subscription = observer
|
|
29
|
+
.getTitleSummaryObservable()
|
|
30
|
+
.subscribe(({ title, summary }) => {
|
|
31
|
+
setTitle(title);
|
|
32
|
+
setSummary(summary);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return () => {
|
|
36
|
+
subscription.unsubscribe();
|
|
37
|
+
observer.clearFeedDataInterval();
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}, [player, feedUrl, reloadData, isLive]);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (isLive && feedData?.entry?.[0]) {
|
|
44
|
+
setTitle(feedData.entry[0].title || "");
|
|
45
|
+
setSummary(feedData.entry[0].summary || "");
|
|
46
|
+
}
|
|
47
|
+
}, [feedData]);
|
|
48
|
+
|
|
49
|
+
return { title, summary };
|
|
50
|
+
};
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
castAndFallbackColor,
|
|
15
15
|
compact,
|
|
16
16
|
getValue,
|
|
17
|
+
getColorFromData,
|
|
17
18
|
} from "../";
|
|
18
19
|
|
|
19
20
|
import {
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
EMPTY,
|
|
24
25
|
FALLBACK,
|
|
25
26
|
TRANSFORM,
|
|
27
|
+
defaultColor,
|
|
26
28
|
} from "./fixtures";
|
|
27
29
|
|
|
28
30
|
describe("getKeyForLabel", () => {
|
|
@@ -388,3 +390,60 @@ describe("getValue", () => {
|
|
|
388
390
|
expect(getValue({ value })(value)).toBeNull();
|
|
389
391
|
});
|
|
390
392
|
});
|
|
393
|
+
|
|
394
|
+
describe("getColorFromData", () => {
|
|
395
|
+
it("should return value directly if valid color", () => {
|
|
396
|
+
const result = getColorFromData({
|
|
397
|
+
data: entry,
|
|
398
|
+
key: "background_color",
|
|
399
|
+
getValue: getValue(componentStyle),
|
|
400
|
+
defaultColor,
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
expect(result).toBe("#123456");
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
it("should return valid rgba color name", () => {
|
|
407
|
+
const result = getColorFromData({
|
|
408
|
+
data: entry,
|
|
409
|
+
key: "component_background_color",
|
|
410
|
+
getValue: getValue(componentStyle),
|
|
411
|
+
defaultColor,
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
expect(result).toBe("rgba(255, 255, 255, 0)");
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
it("should return path value if path value is set and is valid color", () => {
|
|
418
|
+
const result = getColorFromData({
|
|
419
|
+
data: entry,
|
|
420
|
+
key: VAL.colorKeyPath,
|
|
421
|
+
getValue: getValue(componentStyle),
|
|
422
|
+
defaultColor,
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
expect(result).toBe("#123456");
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it("should return defaultColor if key value and path value are invalid", () => {
|
|
429
|
+
const result = getColorFromData({
|
|
430
|
+
data: entry,
|
|
431
|
+
key: VAL.invalidColorKey,
|
|
432
|
+
getValue: getValue(componentStyle),
|
|
433
|
+
defaultColor,
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
expect(result).toBe(defaultColor);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it("should return defaultColor if path does not exist", () => {
|
|
440
|
+
const result = getColorFromData({
|
|
441
|
+
data: entry,
|
|
442
|
+
key: VAL.invalidColorKeyPath,
|
|
443
|
+
getValue: getValue(componentStyle),
|
|
444
|
+
defaultColor,
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
expect(result).toBe(defaultColor);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/* eslint-disable max-len */
|
|
2
2
|
|
|
3
|
+
export const defaultColor = "#ffffff";
|
|
4
|
+
|
|
3
5
|
export const entry = {
|
|
4
6
|
type: {
|
|
5
7
|
value: "video",
|
|
@@ -26,7 +28,9 @@ export const entry = {
|
|
|
26
28
|
type: "video/mp4",
|
|
27
29
|
src: "https://wino-feed.s3.amazonaws.com/movieFeed/Ford+v+Ferrari.mp4",
|
|
28
30
|
},
|
|
31
|
+
background_color: "#123456",
|
|
29
32
|
extensions: {
|
|
33
|
+
background_color: "#123456",
|
|
30
34
|
free: false,
|
|
31
35
|
duration: 9000,
|
|
32
36
|
section: "New Releases",
|
|
@@ -46,7 +50,11 @@ export const componentStyle = {
|
|
|
46
50
|
horizontal_list_cell_width: "400",
|
|
47
51
|
cell_plugin_configuration_id: "267bd05a-08bd-4675-bdd3-9b73899773f0",
|
|
48
52
|
horizontal_list_scaled_switch: false,
|
|
53
|
+
background_color: "#123456",
|
|
49
54
|
component_background_color: "rgba(255, 255, 255, 0)",
|
|
55
|
+
background_color_1: "extensions.background_color",
|
|
56
|
+
background_color_2: "invalidColorKey",
|
|
57
|
+
background_color_3: "extensions.invalidColorKeyPath",
|
|
50
58
|
component_padding_left: "",
|
|
51
59
|
horizontal_list_next_offset: 20,
|
|
52
60
|
component_margin_bottom: "",
|
|
@@ -93,6 +101,11 @@ export const VAL = {
|
|
|
93
101
|
upper: "STRING",
|
|
94
102
|
width: 400,
|
|
95
103
|
height: 225,
|
|
104
|
+
colorKey: "background_color",
|
|
105
|
+
colorKeyRgba: "component_background_color",
|
|
106
|
+
colorKeyPath: "background_color_1",
|
|
107
|
+
invalidColorKey: "background_color_2",
|
|
108
|
+
invalidColorKeyPath: "background_color_3",
|
|
96
109
|
};
|
|
97
110
|
|
|
98
111
|
export const TRANSFORM = {
|
package/cellUtils/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
import dayjs from "dayjs";
|
|
3
|
+
import validateColor from "validate-color";
|
|
3
4
|
|
|
4
5
|
import { toNumberWithDefault, toNumberWithDefaultZero } from "../numberUtils";
|
|
5
6
|
import { transformColorCode as fixColorHexCode } from "../transform";
|
|
@@ -343,6 +344,19 @@ export const ifElseFocused = R.curry(
|
|
|
343
344
|
state === "focused" ? focusedValue : defaultValue
|
|
344
345
|
);
|
|
345
346
|
|
|
347
|
+
export const ifElseSelected = R.curry(
|
|
348
|
+
(state: string, selectedValue, defaultValue) => {
|
|
349
|
+
switch (state) {
|
|
350
|
+
case "selected":
|
|
351
|
+
return selectedValue;
|
|
352
|
+
case "focused_selected":
|
|
353
|
+
return selectedValue;
|
|
354
|
+
default:
|
|
355
|
+
return defaultValue;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
);
|
|
359
|
+
|
|
346
360
|
/**
|
|
347
361
|
* Map textAlign values to their corresponding alignSelf values
|
|
348
362
|
* This is so that we could use the same field for both properties
|
|
@@ -430,3 +444,31 @@ export const toResizeMode = (
|
|
|
430
444
|
resizeMode: "contain",
|
|
431
445
|
};
|
|
432
446
|
};
|
|
447
|
+
|
|
448
|
+
type GetColorFromData = {
|
|
449
|
+
data: Record<string, any>;
|
|
450
|
+
key: string;
|
|
451
|
+
getValue: Function;
|
|
452
|
+
defaultColor: string;
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
export const getColorFromData = ({
|
|
456
|
+
data,
|
|
457
|
+
key,
|
|
458
|
+
getValue,
|
|
459
|
+
defaultColor,
|
|
460
|
+
}: GetColorFromData): string => {
|
|
461
|
+
const value = getValue(key);
|
|
462
|
+
|
|
463
|
+
if (validateColor(value)) {
|
|
464
|
+
return value;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
const pathValue = R.path(value.split("."), data);
|
|
468
|
+
|
|
469
|
+
if (pathValue && validateColor(pathValue)) {
|
|
470
|
+
return pathValue;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return defaultColor;
|
|
474
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`subscriber can be invoked without args 1`] = `
|
|
3
|
+
exports[`functionUtils subscriber can be invoked without args 1`] = `
|
|
4
4
|
Object {
|
|
5
5
|
"handlers": Object {},
|
|
6
6
|
"invokeHandler": [Function],
|
|
@@ -9,7 +9,7 @@ Object {
|
|
|
9
9
|
}
|
|
10
10
|
`;
|
|
11
11
|
|
|
12
|
-
exports[`subscriber returns the original object with additional methods 1`] = `
|
|
12
|
+
exports[`functionUtils subscriber returns the original object with additional methods 1`] = `
|
|
13
13
|
Object {
|
|
14
14
|
"foo": "bar",
|
|
15
15
|
"handlers": Object {},
|