@applicaster/zapp-react-native-utils 12.0.0-alpha.4433422595 → 12.0.0-alpha.4440903139
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/AnalyticPlayerListener.ts +141 -0
- package/analyticsUtils/AnalyticsEvents/index.ts +13 -0
- package/analyticsUtils/AnalyticsEvents/searchEvents.ts +21 -0
- package/analyticsUtils/AnalyticsEvents/sendShareEvent.ts +21 -0
- package/analyticsUtils/PlayerAnalyticsManager.ts +90 -0
- package/analyticsUtils/analyticsPlugins.ts +25 -0
- package/analyticsUtils/events.ts +12 -0
- package/analyticsUtils/index.tsx +12 -0
- package/analyticsUtils/{analyticsTracker.ts → playerAnalyticsTracker.ts} +19 -10
- package/appUtils/accessibilityManager/const.ts +50 -0
- package/appUtils/accessibilityManager/hooks.ts +40 -0
- package/appUtils/accessibilityManager/index.ts +166 -0
- package/appUtils/accessibilityManager/logger.ts +5 -0
- package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +2 -3
- package/appUtils/focusManager/__tests__/focusManager.test.js +4 -24
- package/appUtils/focusManager/__tests__/index.test.ts +2 -3
- package/appUtils/focusManager/index.ts +76 -78
- package/appUtils/focusManager/treeDataStructure/Utils/index.js +31 -16
- package/appUtils/focusManager/utils/index.ts +100 -0
- package/appUtils/focusManagerAux/index.ts +76 -0
- package/appUtils/focusManagerAux/utils/index.ts +100 -0
- package/appUtils/index.js +2 -0
- package/appUtils/keyCodes/keys.web.js +8 -0
- package/appUtils/keyCodes/keysByPlatform.js +11 -1
- package/appUtils/platform/const.ts +25 -0
- package/appUtils/platform/index.ts +3 -0
- package/appUtils/platform/platformUtils.ts +218 -0
- package/appUtils/playerManager/conts.ts +1 -0
- package/appUtils/playerManager/index.ts +20 -32
- package/appUtils/playerManager/nativePlayerManager.ts +12 -0
- package/appUtils/playerManager/player.ts +10 -3
- package/appUtils/playerManager/playerHooks/usePlayerCurrentTime.tsx +57 -0
- package/appUtils/playerManager/playerNative.ts +11 -15
- package/appUtils/playerManager/usePlayerControllerSetup.tsx +8 -2
- package/appUtils/playerManager/usePlayerState.tsx +19 -34
- package/arrayUtils/__tests__/isFilledArray.test.ts +63 -0
- package/arrayUtils/index.ts +16 -0
- package/booleanUtils/index.ts +4 -4
- package/cellUtils/__tests__/cellUtils.test.ts +9 -20
- package/cellUtils/index.ts +44 -17
- package/dateUtils/index.ts +11 -0
- package/focusManager/FocusManager.ts +20 -5
- package/focusManager/__tests__/FocusManager.test.ts +0 -1
- package/functionUtils/index.ts +38 -0
- package/headersUtils/index.ts +1 -0
- package/index.d.ts +15 -0
- package/inflatedUrlUtils/index.ts +4 -4
- package/keyboardState/index.ts +0 -0
- package/localizationUtils/__tests__/localizationUtils.test.ts +72 -53
- package/localizationUtils/index.ts +13 -22
- package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
- package/manifestUtils/defaultManifestConfigurations/player.js +123 -1
- package/manifestUtils/keys.js +2 -1
- package/navigationUtils/index.ts +49 -1
- package/numberUtils/__tests__/isLikeNumber.test.ts +18 -0
- package/numberUtils/__tests__/toNumber.test.ts +2 -2
- package/numberUtils/__tests__/toPositiveNumberWithDefault.test.ts +66 -0
- package/numberUtils/__tests__/toPositiveNumberWithDefaultZero.test.ts +66 -0
- package/numberUtils/index.ts +27 -16
- package/package.json +2 -2
- package/playerUtils/configurationGenerator.ts +123 -1
- package/playerUtils/imaScriptDom.ts +59 -0
- package/pluginUtils/index.ts +9 -0
- package/reactHooks/autoscrolling/__tests__/{useTrackedView.test.ts → useTrackedView.test.tsx} +16 -1
- package/reactHooks/cell-click/__tests__/index.test.js +13 -4
- package/reactHooks/cell-click/index.ts +28 -14
- package/reactHooks/debugging/__tests__/index.test.js +81 -11
- package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +69 -6
- package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +30 -70
- package/reactHooks/feed/__tests__/useFeedRefresh.test.tsx +6 -2
- package/reactHooks/feed/__tests__/useInflatedUrl.test.ts +18 -3
- package/reactHooks/feed/useBatchLoading.ts +52 -28
- package/reactHooks/feed/useBuildPipesUrl.ts +7 -10
- package/reactHooks/feed/useFeedRefresh.tsx +9 -7
- package/reactHooks/feed/useInflatedUrl.ts +44 -15
- package/reactHooks/layout/__tests__/{index.test.js → index.test.tsx} +43 -29
- package/reactHooks/layout/getDeviceInfo/index.ts +4 -2
- package/reactHooks/layout/types/index.ts +1 -0
- package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +134 -0
- package/reactHooks/layout/useDimensions/useDimensions.ts +7 -2
- package/reactHooks/navigation/__mocks__/index.ts +13 -0
- package/reactHooks/navigation/__mocks__/useNavigation.ts +3 -0
- package/reactHooks/navigation/__tests__/index.test.tsx +11 -8
- package/reactHooks/navigation/index.ts +48 -65
- package/reactHooks/player/useAutoSeek.tsx +9 -7
- package/reactHooks/resolvers/useCellResolver.ts +5 -1
- package/reactHooks/screen/__tests__/useCurrentScreenData.test.tsx +21 -23
- package/reactHooks/screen/index.ts +2 -0
- package/reactHooks/screen/useScreenBackgroundColor.ts +23 -0
- package/reactHooks/screen/useScreenContext.ts +3 -3
- package/reactHooks/useConfiguration.ts +2 -2
- package/reactUtils/index.ts +104 -0
- package/screenState/index.ts +0 -8
- package/stringUtils/index.ts +5 -0
- package/testUtils/getByTestId.ts +14 -0
- package/testUtils/index.tsx +65 -30
- package/types.ts +4 -0
- package/appUtils/focusManager/FocusableEvents.ts +0 -8
- package/appUtils/focusManager/treeDataStructure/Utils/__tests__/Utils_android.test.js +0 -1094
- package/appUtils/focusManager/treeDataStructure/Utils/index.android.js +0 -261
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
const mocked_state = {
|
|
4
|
-
remoteConfigurations: { localizations: {} },
|
|
5
|
-
appData: {
|
|
6
|
-
languageCode: "en",
|
|
7
|
-
countryCode: "US",
|
|
8
|
-
},
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
let mocked_locale = ["en-US"];
|
|
12
|
-
|
|
13
|
-
jest.doMock("react-redux", () => ({
|
|
14
|
-
useSelector: jest.fn((fn) => fn(mocked_state)),
|
|
15
|
-
}));
|
|
1
|
+
import { NativeModules } from "react-native";
|
|
16
2
|
|
|
17
|
-
const
|
|
3
|
+
const settingsManagerMock = {
|
|
18
4
|
getConstants: jest.fn(() => ({
|
|
19
|
-
settings: { AppleLanguages:
|
|
5
|
+
settings: { AppleLanguages: ["en-US"] },
|
|
20
6
|
})),
|
|
21
7
|
};
|
|
22
8
|
|
|
23
|
-
const
|
|
9
|
+
const qbCommunicationModuleMock = {
|
|
24
10
|
languageLocale: "en",
|
|
25
11
|
countryLocale: "US",
|
|
12
|
+
uiLanguage: "en-US",
|
|
26
13
|
};
|
|
27
14
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
ReactNative.NativeModules.QuickBrickCommunicationModule =
|
|
31
|
-
QuickBrickCommunicationModule;
|
|
32
|
-
|
|
33
|
-
const { useIsRTL } = require("../index");
|
|
15
|
+
NativeModules.SettingsManager = settingsManagerMock;
|
|
16
|
+
NativeModules.QuickBrickCommunicationModule = qbCommunicationModuleMock;
|
|
34
17
|
|
|
35
18
|
describe("localizationUtils", () => {
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
jest.resetModules();
|
|
21
|
+
});
|
|
22
|
+
|
|
36
23
|
describe("when the app has a single locale", () => {
|
|
37
24
|
describe("when the app has only a RTL language as locale", () => {
|
|
38
25
|
beforeEach(() => {
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
jest.resetModules();
|
|
27
|
+
const RN = require("react-native");
|
|
28
|
+
|
|
29
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
30
|
+
languageLocale: "he",
|
|
31
|
+
countryLocale: "IL",
|
|
32
|
+
uiLanguage: "he-HE",
|
|
41
33
|
};
|
|
42
34
|
});
|
|
43
35
|
|
|
44
36
|
it("useIsRTL returns true", () => {
|
|
37
|
+
const { useIsRTL } = require("../index");
|
|
45
38
|
expect(useIsRTL()).toBe(true);
|
|
46
39
|
});
|
|
47
40
|
});
|
|
48
41
|
|
|
49
42
|
describe("when the app has only a LTR language as locale", () => {
|
|
50
43
|
beforeEach(() => {
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
jest.resetModules();
|
|
45
|
+
|
|
46
|
+
const RN = require("react-native");
|
|
47
|
+
|
|
48
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
49
|
+
languageLocale: "en",
|
|
50
|
+
countryLocale: "US",
|
|
51
|
+
uiLanguage: "en",
|
|
53
52
|
};
|
|
54
53
|
});
|
|
55
54
|
|
|
56
55
|
it("useIsRTL returns false", () => {
|
|
56
|
+
const { useIsRTL } = require("../index");
|
|
57
57
|
expect(useIsRTL()).toBe(false);
|
|
58
58
|
});
|
|
59
59
|
});
|
|
@@ -63,45 +63,56 @@ describe("localizationUtils", () => {
|
|
|
63
63
|
describe("when device locale is in the app's locales", () => {
|
|
64
64
|
describe("when device locale is LTR", () => {
|
|
65
65
|
beforeEach(() => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
};
|
|
66
|
+
jest.resetModules();
|
|
67
|
+
|
|
68
|
+
const RN = require("react-native");
|
|
70
69
|
|
|
71
|
-
|
|
70
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
71
|
+
languageLocale: "en",
|
|
72
|
+
countryLocale: "US",
|
|
73
|
+
uiLanguage: "en-US",
|
|
74
|
+
};
|
|
72
75
|
});
|
|
73
76
|
|
|
74
77
|
it("useIsRTL returns false", () => {
|
|
78
|
+
const { useIsRTL } = require("../index");
|
|
75
79
|
expect(useIsRTL()).toBe(false);
|
|
76
80
|
});
|
|
77
81
|
});
|
|
78
82
|
|
|
79
83
|
describe("when device locale is RTL", () => {
|
|
80
84
|
beforeEach(() => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
en: "http://url.com",
|
|
84
|
-
};
|
|
85
|
+
jest.resetModules();
|
|
86
|
+
const RN = require("react-native");
|
|
85
87
|
|
|
86
|
-
|
|
88
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
89
|
+
languageLocale: "he",
|
|
90
|
+
countryLocale: "IL",
|
|
91
|
+
uiLanguage: "he",
|
|
92
|
+
};
|
|
87
93
|
});
|
|
88
94
|
|
|
89
95
|
it("useIsRTL returns true", () => {
|
|
96
|
+
const { useIsRTL } = require("../index");
|
|
90
97
|
expect(useIsRTL()).toBe(true);
|
|
91
98
|
});
|
|
92
99
|
});
|
|
93
100
|
|
|
94
101
|
describe("when a device has a secondary language in a supported language", () => {
|
|
95
102
|
beforeEach(() => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
};
|
|
103
|
+
jest.resetModules();
|
|
104
|
+
|
|
105
|
+
const RN = require("react-native");
|
|
100
106
|
|
|
101
|
-
|
|
107
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
108
|
+
languageLocale: "he",
|
|
109
|
+
countryLocale: "IL",
|
|
110
|
+
uiLanguage: "he",
|
|
111
|
+
};
|
|
102
112
|
});
|
|
103
113
|
|
|
104
114
|
it("useIsRTL returns true", () => {
|
|
115
|
+
const { useIsRTL } = require("../index");
|
|
105
116
|
expect(useIsRTL()).toBe(true);
|
|
106
117
|
});
|
|
107
118
|
});
|
|
@@ -110,30 +121,38 @@ describe("localizationUtils", () => {
|
|
|
110
121
|
describe("when device locale is not in the app's locales", () => {
|
|
111
122
|
describe("when first app locale is LTR", () => {
|
|
112
123
|
beforeEach(() => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
};
|
|
124
|
+
jest.resetModules();
|
|
125
|
+
|
|
126
|
+
const RN = require("react-native");
|
|
117
127
|
|
|
118
|
-
|
|
128
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
129
|
+
languageLocale: "fr",
|
|
130
|
+
countryLocale: "FR",
|
|
131
|
+
uiLanguage: "fr-FR",
|
|
132
|
+
};
|
|
119
133
|
});
|
|
120
134
|
|
|
121
135
|
it("useIsRTL returns false", () => {
|
|
136
|
+
const { useIsRTL } = require("../index");
|
|
122
137
|
expect(useIsRTL()).toBe(false);
|
|
123
138
|
});
|
|
124
139
|
});
|
|
125
140
|
|
|
126
141
|
describe("when first app locale is RTL", () => {
|
|
127
142
|
beforeEach(() => {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
};
|
|
143
|
+
jest.resetModules();
|
|
144
|
+
|
|
145
|
+
const RN = require("react-native");
|
|
132
146
|
|
|
133
|
-
|
|
147
|
+
RN.NativeModules.QuickBrickCommunicationModule = {
|
|
148
|
+
languageLocale: "he",
|
|
149
|
+
countryLocale: "HE",
|
|
150
|
+
uiLanguage: "he",
|
|
151
|
+
};
|
|
134
152
|
});
|
|
135
153
|
|
|
136
154
|
it("useIsRTL returns true", () => {
|
|
155
|
+
const { useIsRTL } = require("../index");
|
|
137
156
|
expect(useIsRTL()).toBe(true);
|
|
138
157
|
});
|
|
139
158
|
});
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
import { ViewStyle } from "react-native";
|
|
3
|
-
import { useSelector } from "react-redux";
|
|
4
3
|
|
|
5
|
-
import { getDeviceLocales } from "./deviceLocales";
|
|
6
4
|
import { useMemo } from "react";
|
|
7
5
|
import { getUILanguage } from "../appUtils/localizationsHelper";
|
|
6
|
+
import { utilsLogger } from "../logger";
|
|
8
7
|
|
|
9
8
|
export {
|
|
10
9
|
getLocale,
|
|
@@ -45,34 +44,26 @@ export function useLocalizedStrings({ localizations }) {
|
|
|
45
44
|
return result;
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
function
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
)
|
|
47
|
+
export function getIsRTL(): boolean {
|
|
48
|
+
const uiLanguage = getUILanguage();
|
|
49
|
+
|
|
50
|
+
if (!uiLanguage) {
|
|
51
|
+
utilsLogger.error({ message: "getUILanguage returned null or undefined" });
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
return R.head(matchingLanguages);
|
|
53
|
+
return false;
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
|
|
58
|
-
}
|
|
56
|
+
const [languageCode] = uiLanguage.split("-");
|
|
59
57
|
|
|
60
|
-
|
|
61
|
-
const deviceLocales = getDeviceLocales() || [];
|
|
62
|
-
const localeToUse = getLocaleToUse(deviceLocales, R.keys(localizations));
|
|
58
|
+
const lowerCaseLanguageCode = languageCode.toLocaleLowerCase();
|
|
63
59
|
|
|
64
|
-
|
|
65
|
-
}
|
|
60
|
+
const isRTL = R.contains(lowerCaseLanguageCode, RTL_LOCALES);
|
|
66
61
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"localizations",
|
|
70
|
-
]);
|
|
62
|
+
return isRTL;
|
|
63
|
+
}
|
|
71
64
|
|
|
72
65
|
export function useIsRTL(): boolean {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return getIsRTLFromLocalizations(localizations);
|
|
66
|
+
return getIsRTL();
|
|
76
67
|
}
|
|
77
68
|
|
|
78
69
|
export const applyRTLStylesIfNeeded = (
|
|
@@ -18,6 +18,7 @@ function getDevice(platform) {
|
|
|
18
18
|
case "lg_tv":
|
|
19
19
|
case "samsung_tv":
|
|
20
20
|
case "web":
|
|
21
|
+
case "vizio":
|
|
21
22
|
return "tv";
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -1663,7 +1664,8 @@ function getPlayerConfiguration({ platform }) {
|
|
|
1663
1664
|
platform.includes("lg") ||
|
|
1664
1665
|
platform.includes("samsung") ||
|
|
1665
1666
|
platform.includes("android_tv") ||
|
|
1666
|
-
platform.includes("amazon")
|
|
1667
|
+
platform.includes("amazon") ||
|
|
1668
|
+
platform.includes("vizio")
|
|
1667
1669
|
) {
|
|
1668
1670
|
styles.fields.push(
|
|
1669
1671
|
// Captions Menu
|
|
@@ -1794,6 +1796,30 @@ function getPlayerConfiguration({ platform }) {
|
|
|
1794
1796
|
key: "menu_header_samsung_letter_spacing",
|
|
1795
1797
|
initial_value: 0,
|
|
1796
1798
|
},
|
|
1799
|
+
{
|
|
1800
|
+
type: "vizio_font_selector",
|
|
1801
|
+
label: "Vizio Font Family",
|
|
1802
|
+
key: "menu_header_vizio_font_family",
|
|
1803
|
+
initial_value: "SmsungOneUI-Bold",
|
|
1804
|
+
},
|
|
1805
|
+
{
|
|
1806
|
+
type: "number_input",
|
|
1807
|
+
label: "Vizio Font Size",
|
|
1808
|
+
key: "menu_header_vizio_font_size",
|
|
1809
|
+
initial_value: 30,
|
|
1810
|
+
},
|
|
1811
|
+
{
|
|
1812
|
+
type: "number_input",
|
|
1813
|
+
label: "Vizio Line Height",
|
|
1814
|
+
key: "menu_header_vizio_line_height",
|
|
1815
|
+
initial_value: 60,
|
|
1816
|
+
},
|
|
1817
|
+
{
|
|
1818
|
+
type: "number_input",
|
|
1819
|
+
label: "Vizio Letter Spacing",
|
|
1820
|
+
key: "menu_header_vizio_letter_spacing",
|
|
1821
|
+
initial_value: 0,
|
|
1822
|
+
},
|
|
1797
1823
|
]
|
|
1798
1824
|
),
|
|
1799
1825
|
// Captions Menu - Item Text Label
|
|
@@ -1873,6 +1899,30 @@ function getPlayerConfiguration({ platform }) {
|
|
|
1873
1899
|
key: "menu_item_samsung_letter_spacing",
|
|
1874
1900
|
initial_value: 0,
|
|
1875
1901
|
},
|
|
1902
|
+
{
|
|
1903
|
+
type: "vizio_font_selector",
|
|
1904
|
+
label: "Vizio Font Family",
|
|
1905
|
+
key: "menu_item_vizio_font_family",
|
|
1906
|
+
initial_value: "SmsungOneUI-Bold",
|
|
1907
|
+
},
|
|
1908
|
+
{
|
|
1909
|
+
type: "number_input",
|
|
1910
|
+
label: "Vizio Font Size",
|
|
1911
|
+
key: "menu_item_vizio_font_size",
|
|
1912
|
+
initial_value: 25,
|
|
1913
|
+
},
|
|
1914
|
+
{
|
|
1915
|
+
type: "number_input",
|
|
1916
|
+
label: "Vizio Line Height",
|
|
1917
|
+
key: "menu_item_vizio_line_height",
|
|
1918
|
+
initial_value: 40,
|
|
1919
|
+
},
|
|
1920
|
+
{
|
|
1921
|
+
type: "number_input",
|
|
1922
|
+
label: "Vizio Letter Spacing",
|
|
1923
|
+
key: "menu_item_vizio_letter_spacing",
|
|
1924
|
+
initial_value: 0,
|
|
1925
|
+
},
|
|
1876
1926
|
]
|
|
1877
1927
|
),
|
|
1878
1928
|
// Captions Menu - Item Border
|
|
@@ -2016,6 +2066,18 @@ function getPlayerConfiguration({ platform }) {
|
|
|
2016
2066
|
key: "samsung_tv_video_player_title_font_size",
|
|
2017
2067
|
initial_value: 64,
|
|
2018
2068
|
},
|
|
2069
|
+
{
|
|
2070
|
+
type: "vizio_font_selector",
|
|
2071
|
+
label: "Vizio Font Family",
|
|
2072
|
+
key: "vizio_video_player_title_font_family",
|
|
2073
|
+
initial_value: "Ubuntu-Bold",
|
|
2074
|
+
},
|
|
2075
|
+
{
|
|
2076
|
+
type: "number_input",
|
|
2077
|
+
label: "Vizio Font Size",
|
|
2078
|
+
key: "vizio_video_player_title_font_size",
|
|
2079
|
+
initial_value: 64,
|
|
2080
|
+
},
|
|
2019
2081
|
{
|
|
2020
2082
|
type: "tvos_font_selector",
|
|
2021
2083
|
label: "tvOS Font Family",
|
|
@@ -2089,6 +2151,18 @@ function getPlayerConfiguration({ platform }) {
|
|
|
2089
2151
|
key: "samsung_tv_video_player_summary_font_size",
|
|
2090
2152
|
initial_value: 30,
|
|
2091
2153
|
},
|
|
2154
|
+
{
|
|
2155
|
+
type: "vizio_font_selector",
|
|
2156
|
+
label: "Vizio Font Family",
|
|
2157
|
+
key: "vizio_video_player_summary_font_family",
|
|
2158
|
+
initial_value: "Ubuntu-Bold",
|
|
2159
|
+
},
|
|
2160
|
+
{
|
|
2161
|
+
type: "number_input",
|
|
2162
|
+
label: "Vizio Font Size",
|
|
2163
|
+
key: "vizio_video_player_summary_font_size",
|
|
2164
|
+
initial_value: 30,
|
|
2165
|
+
},
|
|
2092
2166
|
{
|
|
2093
2167
|
type: "tvos_font_selector",
|
|
2094
2168
|
label: "tvOS Font Family",
|
|
@@ -2156,6 +2230,18 @@ function getPlayerConfiguration({ platform }) {
|
|
|
2156
2230
|
key: "samsung_tv_audio_player_title_font_size",
|
|
2157
2231
|
initial_value: 38,
|
|
2158
2232
|
},
|
|
2233
|
+
{
|
|
2234
|
+
type: "vizio_font_selector",
|
|
2235
|
+
label: "Vizio Font Family",
|
|
2236
|
+
key: "vizio_tv_audio_player_title_font_family",
|
|
2237
|
+
initial_value: "Ubuntu-Bold",
|
|
2238
|
+
},
|
|
2239
|
+
{
|
|
2240
|
+
type: "number_input",
|
|
2241
|
+
label: "Vizio Font Size",
|
|
2242
|
+
key: "vizio_audio_player_title_font_size",
|
|
2243
|
+
initial_value: 38,
|
|
2244
|
+
},
|
|
2159
2245
|
{
|
|
2160
2246
|
type: "tvos_font_selector",
|
|
2161
2247
|
label: "tvOS Font Family",
|
|
@@ -2211,6 +2297,18 @@ function getPlayerConfiguration({ platform }) {
|
|
|
2211
2297
|
key: "samsung_tv_audio_player_summary_font_size",
|
|
2212
2298
|
initial_value: 20,
|
|
2213
2299
|
},
|
|
2300
|
+
{
|
|
2301
|
+
type: "vizio_font_selector",
|
|
2302
|
+
label: "Vizio Font Family",
|
|
2303
|
+
key: "vizio_audio_player_summary_font_family",
|
|
2304
|
+
initial_value: "Ubuntu-Bold",
|
|
2305
|
+
},
|
|
2306
|
+
{
|
|
2307
|
+
type: "number_input",
|
|
2308
|
+
label: "Vizio Font Size",
|
|
2309
|
+
key: "vizio_audio_player_summary_font_size",
|
|
2310
|
+
initial_value: 20,
|
|
2311
|
+
},
|
|
2214
2312
|
{
|
|
2215
2313
|
type: "tvos_font_selector",
|
|
2216
2314
|
label: "tvOS Font Family",
|
|
@@ -2266,6 +2364,18 @@ function getPlayerConfiguration({ platform }) {
|
|
|
2266
2364
|
key: "samsung_tv_player_time_font_size",
|
|
2267
2365
|
initial_value: 20,
|
|
2268
2366
|
},
|
|
2367
|
+
{
|
|
2368
|
+
type: "vizio_font_selector",
|
|
2369
|
+
label: "Vizio Font Family",
|
|
2370
|
+
key: "vizio_player_time_font_family",
|
|
2371
|
+
initial_value: "Ubuntu-Bold",
|
|
2372
|
+
},
|
|
2373
|
+
{
|
|
2374
|
+
type: "number_input",
|
|
2375
|
+
label: "Vizio Font Size",
|
|
2376
|
+
key: "vizio_player_time_font_size",
|
|
2377
|
+
initial_value: 20,
|
|
2378
|
+
},
|
|
2269
2379
|
{
|
|
2270
2380
|
type: "android_font_selector",
|
|
2271
2381
|
label: "Android TV Font Family",
|
|
@@ -2321,6 +2431,18 @@ function getPlayerConfiguration({ platform }) {
|
|
|
2321
2431
|
key: "samsung_tv_audio_player_run_time_font_size",
|
|
2322
2432
|
initial_value: 20,
|
|
2323
2433
|
},
|
|
2434
|
+
{
|
|
2435
|
+
type: "vizio_font_selector",
|
|
2436
|
+
label: "Vizio Font Family",
|
|
2437
|
+
key: "vizio_audio_player_run_time_font_family",
|
|
2438
|
+
initial_value: "Ubuntu-Bold",
|
|
2439
|
+
},
|
|
2440
|
+
{
|
|
2441
|
+
type: "number_input",
|
|
2442
|
+
label: "Vizio Font Size",
|
|
2443
|
+
key: "vizio_audio_player_run_time_font_size",
|
|
2444
|
+
initial_value: 20,
|
|
2445
|
+
},
|
|
2324
2446
|
{
|
|
2325
2447
|
type: "tvos_font_selector",
|
|
2326
2448
|
label: "tvOS Font Family",
|
package/manifestUtils/keys.js
CHANGED
|
@@ -17,10 +17,11 @@ const ZAPPIFEST_FIELDS = {
|
|
|
17
17
|
lg: "lg_tv_font_selector",
|
|
18
18
|
samsung: "samsung_font_selector",
|
|
19
19
|
roku: "roku_font_selector",
|
|
20
|
+
vizio: "vizio_font_selector",
|
|
20
21
|
},
|
|
21
22
|
};
|
|
22
23
|
|
|
23
|
-
const TV_PLATFORMS = ["tvOS", "android", "LG", "samsung", "roku"];
|
|
24
|
+
const TV_PLATFORMS = ["tvOS", "android", "LG", "samsung", "roku", "vizio"];
|
|
24
25
|
|
|
25
26
|
const FontPropsForTVPlatform = (platform) => ({
|
|
26
27
|
[`${R.toLower(platform)}FontFamily`]: {
|
package/navigationUtils/index.ts
CHANGED
|
@@ -263,7 +263,7 @@ export function getTargetRoute(
|
|
|
263
263
|
pathname = "",
|
|
264
264
|
{
|
|
265
265
|
contentTypes = undefined,
|
|
266
|
-
layoutVersion =
|
|
266
|
+
layoutVersion = "v2",
|
|
267
267
|
rivers = {},
|
|
268
268
|
}: {
|
|
269
269
|
contentTypes?: ZappContentTypes | null;
|
|
@@ -592,3 +592,51 @@ export function isMenuDisabled(
|
|
|
592
592
|
export function routeIsPlayerScreen(currentRoute) {
|
|
593
593
|
return currentRoute?.includes("/playable");
|
|
594
594
|
}
|
|
595
|
+
|
|
596
|
+
export const getNavBarProps =
|
|
597
|
+
(currentRiver: ZappRiver, pathname: string, title: string) => () => {
|
|
598
|
+
const props = getNavigationPropsV2({
|
|
599
|
+
currentRiver,
|
|
600
|
+
title,
|
|
601
|
+
category: "nav_bar",
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
if (props) {
|
|
605
|
+
return {
|
|
606
|
+
...props,
|
|
607
|
+
id: pathname,
|
|
608
|
+
pathname: pathname,
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
return null;
|
|
613
|
+
};
|
|
614
|
+
|
|
615
|
+
export const findMenuPlugin = (
|
|
616
|
+
navigations: ZappNavigation[],
|
|
617
|
+
plugins
|
|
618
|
+
): QuickBrickPlugin => {
|
|
619
|
+
return resolveNavigationPlugin({
|
|
620
|
+
category: "menu",
|
|
621
|
+
navigations,
|
|
622
|
+
plugins,
|
|
623
|
+
}) as QuickBrickPlugin;
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
export const shouldNavBarDisplayMenu = (currentRiver: ZappRiver, plugins) =>
|
|
627
|
+
findMenuPlugin(currentRiver.navigations, plugins)?.identifier ===
|
|
628
|
+
"quick_brick_side_menu" ||
|
|
629
|
+
currentRiver?.navigations.findIndex(
|
|
630
|
+
(nav) => nav.category === "nav_bar" && nav.general?.override_menu_target
|
|
631
|
+
) > -1;
|
|
632
|
+
|
|
633
|
+
export const getScreenId = (
|
|
634
|
+
screenData: LegacyNavigationScreenData,
|
|
635
|
+
fallbackRiver: ZappRiver
|
|
636
|
+
) => {
|
|
637
|
+
return screenData?.targetScreen
|
|
638
|
+
? screenData?.targetScreen?.id ?? fallbackRiver.id
|
|
639
|
+
: "screen_id" in screenData
|
|
640
|
+
? screenData.screen_id
|
|
641
|
+
: fallbackRiver.id;
|
|
642
|
+
};
|
|
@@ -7,12 +7,24 @@ describe("isLikeNumber", () => {
|
|
|
7
7
|
expect(isLikeNumber(value)).toBe(true);
|
|
8
8
|
});
|
|
9
9
|
|
|
10
|
+
it("value is a number", () => {
|
|
11
|
+
const value = 123.45;
|
|
12
|
+
|
|
13
|
+
expect(isLikeNumber(value)).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
|
|
10
16
|
it("value is a string as number", () => {
|
|
11
17
|
const value = "123";
|
|
12
18
|
|
|
13
19
|
expect(isLikeNumber(value)).toBe(true);
|
|
14
20
|
});
|
|
15
21
|
|
|
22
|
+
it("value is a string as number", () => {
|
|
23
|
+
const value = "123.45";
|
|
24
|
+
|
|
25
|
+
expect(isLikeNumber(value)).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
16
28
|
it("value is empty string", () => {
|
|
17
29
|
const value = "";
|
|
18
30
|
|
|
@@ -54,4 +66,10 @@ describe("isLikeNumber", () => {
|
|
|
54
66
|
|
|
55
67
|
expect(isLikeNumber(value)).toBe(false);
|
|
56
68
|
});
|
|
69
|
+
|
|
70
|
+
it("NaN is not a number", () => {
|
|
71
|
+
const value = NaN;
|
|
72
|
+
|
|
73
|
+
expect(isLikeNumber(value)).toBe(false);
|
|
74
|
+
});
|
|
57
75
|
});
|
|
@@ -2,7 +2,7 @@ import { toNumber } from "..";
|
|
|
2
2
|
|
|
3
3
|
describe("toNumber", () => {
|
|
4
4
|
it("return number if input is number", () => {
|
|
5
|
-
const inputs = [-1, 0, 1, 100];
|
|
5
|
+
const inputs = [-1, 0, 1, 100, 0.2];
|
|
6
6
|
expect.assertions(inputs.length);
|
|
7
7
|
|
|
8
8
|
inputs.forEach((input) => {
|
|
@@ -12,7 +12,7 @@ describe("toNumber", () => {
|
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
it("return number if input is string as number", () => {
|
|
15
|
-
const inputs = ["-1", "0", "1", "100"];
|
|
15
|
+
const inputs = ["-1", "0", "1", "100", "0.2"];
|
|
16
16
|
expect.assertions(inputs.length);
|
|
17
17
|
|
|
18
18
|
inputs.forEach((input) => {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { toPositiveNumberWithDefault } from "..";
|
|
2
|
+
|
|
3
|
+
describe("toNumber", () => {
|
|
4
|
+
const DEFAULT = 5;
|
|
5
|
+
|
|
6
|
+
it("return number if input is positive number", () => {
|
|
7
|
+
const inputs = [0, 1, 2, 100, 200.12, Infinity];
|
|
8
|
+
expect.assertions(inputs.length);
|
|
9
|
+
|
|
10
|
+
inputs.forEach((input) => {
|
|
11
|
+
const output = toPositiveNumberWithDefault(DEFAULT, input);
|
|
12
|
+
expect(output).toBe(input);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("return number if input is positive number as string", () => {
|
|
17
|
+
const inputs = ["0", "1", "2", "100", "200.12"];
|
|
18
|
+
expect.assertions(inputs.length);
|
|
19
|
+
|
|
20
|
+
inputs.forEach((input) => {
|
|
21
|
+
const output = toPositiveNumberWithDefault(DEFAULT, input);
|
|
22
|
+
expect(output).toBe(Number(input));
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("return default number if input is negative number", () => {
|
|
27
|
+
const inputs = [-1, -2, -100, -Infinity];
|
|
28
|
+
expect.assertions(inputs.length);
|
|
29
|
+
|
|
30
|
+
inputs.forEach((input) => {
|
|
31
|
+
const output = toPositiveNumberWithDefault(DEFAULT, input);
|
|
32
|
+
expect(output).toBe(DEFAULT);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("return default number if input is negative number as string", () => {
|
|
37
|
+
const inputs = ["-1", "-2", "-100"];
|
|
38
|
+
expect.assertions(inputs.length);
|
|
39
|
+
|
|
40
|
+
inputs.forEach((input) => {
|
|
41
|
+
const output = toPositiveNumberWithDefault(DEFAULT, input);
|
|
42
|
+
expect(output).toBe(DEFAULT);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("return default if input is not a number or infinite", () => {
|
|
47
|
+
const inputs = [
|
|
48
|
+
"vfdvf",
|
|
49
|
+
null,
|
|
50
|
+
undefined,
|
|
51
|
+
NaN,
|
|
52
|
+
"",
|
|
53
|
+
{},
|
|
54
|
+
{ test: 1 },
|
|
55
|
+
[],
|
|
56
|
+
[1],
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
expect.assertions(inputs.length);
|
|
60
|
+
|
|
61
|
+
inputs.forEach((input) => {
|
|
62
|
+
const output = toPositiveNumberWithDefault(DEFAULT, input);
|
|
63
|
+
expect(output).toBe(DEFAULT);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|