@applicaster/zapp-react-native-utils 15.1.0-rc.9 → 16.0.0-alpha.1011304583
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/README.md +0 -6
- package/actionUtils/index.ts +7 -0
- package/actionsExecutor/ActionExecutorContext.tsx +67 -14
- package/actionsExecutor/feedDecorator.ts +6 -6
- package/adsUtils/__tests__/createVMAP.test.ts +419 -0
- package/adsUtils/index.ts +2 -2
- package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -2
- package/analyticsUtils/PlayerAnalyticsManager.ts +11 -1
- package/analyticsUtils/README.md +1 -1
- package/analyticsUtils/__tests__/analyticsMapper.test.ts +35 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testACP_events.json +1 -1
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testBlockUnlistedParams_rules.json +1 -1
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testEmptyRenameKeepsName_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testEmptyRenameKeepsName_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testEventRegex_events.json +3 -9
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testIgnoreOrdering_events.json +18 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testIgnoreOrdering_rules.json +16 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexEventNoFallback_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexEventNoFallback_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexMultiGroupRename_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexMultiGroupRename_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexNonNamedFullMatch_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexNonNamedFullMatch_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/index.js +20 -0
- package/analyticsUtils/analyticsMapper.ts +4 -1
- package/analyticsUtils/playerAnalyticsTracker.ts +26 -3
- package/appDataUtils/__tests__/urlScheme.test.ts +678 -0
- package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +0 -188
- package/appUtils/HooksManager/__tests__/hooksManager.test.js +16 -2
- package/appUtils/HooksManager/index.ts +12 -18
- package/appUtils/RiverFocusManager/{index.js → index.ts} +25 -18
- package/appUtils/accessibilityManager/const.ts +4 -0
- package/appUtils/accessibilityManager/utils.ts +0 -1
- package/appUtils/contextKeysManager/__tests__/getKeys/failure.test.ts +7 -2
- package/appUtils/contextKeysManager/__tests__/getKeys/success.test.ts +48 -0
- package/appUtils/contextKeysManager/contextResolver.ts +51 -22
- package/appUtils/contextKeysManager/index.ts +65 -10
- package/appUtils/contextKeysManager/utils/index.ts +38 -25
- package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +3 -0
- package/appUtils/focusManager/index.ios.ts +43 -4
- package/appUtils/focusManager/treeDataStructure/Tree/__tests__/Tree.test.js +46 -0
- package/appUtils/focusManager/treeDataStructure/Tree/index.js +18 -18
- package/appUtils/focusManagerAux/utils/index.ios.ts +122 -0
- package/appUtils/focusManagerAux/utils/index.ts +11 -3
- package/appUtils/focusManagerAux/utils/utils.ios.ts +202 -3
- package/appUtils/keyCodes/keys/keys.web.ts +1 -4
- package/appUtils/orientationHelper.ts +2 -4
- package/appUtils/platform/platformUtils.ts +12 -1
- package/appUtils/playerManager/player.ts +4 -0
- package/appUtils/playerManager/playerNative.ts +30 -21
- package/appUtils/playerManager/usePlayerState.tsx +14 -2
- package/cellUtils/index.ts +3 -5
- package/cloudEventsUtils/__tests__/index.test.ts +529 -0
- package/cloudEventsUtils/index.ts +65 -1
- package/colorUtils/__tests__/isTransparentColor.test.ts +76 -0
- package/colorUtils/__tests__/isValidColor.test.ts +70 -0
- package/colorUtils/index.ts +50 -0
- package/componentsUtils/index.ts +8 -0
- package/configurationUtils/__tests__/manifestKeyParser.test.ts +26 -26
- package/enumUtils/__tests__/getEnumKeyByEnumValue.test.ts +207 -0
- package/errorUtils/__tests__/GeneralError.test.ts +97 -0
- package/errorUtils/__tests__/HttpStatusCode.test.ts +344 -0
- package/errorUtils/__tests__/MissingPluginError.test.ts +113 -0
- package/errorUtils/__tests__/NetworkError.test.ts +202 -0
- package/errorUtils/__tests__/getParsedResponse.test.ts +188 -0
- package/errorUtils/__tests__/invariant.test.ts +112 -0
- package/focusManager/aux/index.ts +1 -1
- package/headersUtils/__tests__/headersUtils.test.js +11 -1
- package/headersUtils/index.ts +2 -1
- package/manifestUtils/_internals/__tests__/index.test.js +41 -0
- package/manifestUtils/_internals/index.js +33 -0
- package/manifestUtils/defaultManifestConfigurations/generalContent.js +35 -0
- package/manifestUtils/defaultManifestConfigurations/player.js +59 -1
- package/manifestUtils/fieldUtils/__tests__/fieldUtils.test.js +49 -0
- package/manifestUtils/fieldUtils/index.js +54 -0
- package/manifestUtils/index.js +3 -1
- package/manifestUtils/keys.js +229 -0
- package/manifestUtils/mobileAction/button/__tests__/mobileActionButton.test.js +168 -0
- package/manifestUtils/mobileAction/button/index.js +140 -0
- package/manifestUtils/mobileAction/container/__tests__/mobileActionButtonsContainer.test.js +102 -0
- package/manifestUtils/mobileAction/container/index.js +73 -0
- package/manifestUtils/mobileAction/groups/__tests__/buildMobileActionButtonGroups.test.js +127 -0
- package/manifestUtils/mobileAction/groups/defaults.js +76 -0
- package/manifestUtils/mobileAction/groups/index.js +80 -0
- package/manifestUtils/platformIsTV.js +1 -0
- package/manifestUtils/tvAction/container/index.js +1 -1
- package/numberUtils/__tests__/toNumber.test.ts +27 -0
- package/numberUtils/__tests__/toPositiveNumber.test.ts +193 -0
- package/numberUtils/index.ts +23 -1
- package/package.json +4 -4
- package/pipesUtils/__tests__/buildUrlWithQuery.test.ts +33 -0
- package/pipesUtils/__tests__/withPipesEndpoint.test.tsx +56 -0
- package/pipesUtils/index.ts +1 -0
- package/pipesUtils/withPipesEndpoint.tsx +54 -0
- package/pluginUtils/index.ts +4 -0
- package/reactHooks/advertising/index.ts +2 -2
- package/reactHooks/analytics/__tests__/useSendAnalyticsOnPress.test.ts +537 -0
- package/reactHooks/app/__tests__/useAppState.test.ts +1 -1
- package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +1 -1
- package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +1 -2
- package/reactHooks/cell-click/__tests__/index.test.js +1 -3
- package/reactHooks/cell-click/index.ts +15 -6
- package/reactHooks/configuration/__tests__/index.test.tsx +1 -1
- package/reactHooks/connection/__tests__/index.test.js +1 -1
- package/reactHooks/debugging/__tests__/index.test.js +4 -4
- package/reactHooks/dev/__tests__/useReRenderLog.test.ts +188 -0
- package/reactHooks/device/useIsTablet.tsx +14 -19
- package/reactHooks/device/useMemoizedIsTablet.ts +3 -3
- package/reactHooks/feed/__mocks__/useMarkPipesDataStale.ts +4 -0
- package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +32 -23
- package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +19 -19
- package/reactHooks/feed/__tests__/useEntryScreenId.test.tsx +4 -1
- package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +42 -30
- package/reactHooks/feed/__tests__/useInflatedUrl.test.tsx +1 -1
- package/reactHooks/feed/index.ts +5 -3
- package/reactHooks/feed/useBatchLoading.ts +17 -3
- package/reactHooks/feed/useEntryScreenId.ts +2 -2
- package/reactHooks/feed/{usePipesCacheReset.ts → useMarkPipesDataStale.ts} +14 -4
- package/reactHooks/flatList/useLoadNextPageIfNeeded.ts +13 -16
- package/reactHooks/layout/__tests__/index.test.tsx +1 -1
- package/reactHooks/layout/__tests__/useLayoutVersion.test.tsx +1 -1
- package/reactHooks/layout/useDimensions/__tests__/{useDimensions.test.ts → useDimensions.test.tsx} +105 -25
- package/reactHooks/layout/useDimensions/useDimensions.ts +2 -2
- package/reactHooks/navigation/__tests__/index.test.tsx +2 -4
- package/reactHooks/navigation/index.ts +7 -6
- package/reactHooks/navigation/useRoute.ts +8 -6
- package/reactHooks/player/TVSeekControlller/TVSeekController.ts +27 -10
- package/reactHooks/player/__tests__/useAutoSeek._test.tsx +1 -1
- package/reactHooks/player/__tests__/useTapSeek._test.ts +1 -1
- package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +1 -1
- package/reactHooks/resolvers/__tests__/useComponentResolver.test.tsx +1 -1
- package/reactHooks/resolvers/useCellResolver.ts +6 -2
- package/reactHooks/resolvers/useComponentResolver.ts +8 -2
- package/reactHooks/screen/__tests__/useCurrentScreenData.test.tsx +2 -2
- package/reactHooks/screen/__tests__/useIsStandaloneFullscreen.test.ts +114 -0
- package/reactHooks/screen/__tests__/useScreenBackgroundColor.test.tsx +1 -1
- package/reactHooks/screen/__tests__/useScreenData.test.tsx +1 -1
- package/reactHooks/screen/__tests__/useTargetScreenData.test.tsx +12 -4
- package/reactHooks/screen/useTargetScreenData.ts +4 -2
- package/reactHooks/state/useRivers.ts +1 -1
- package/reactHooks/ui/__tests__/useFadeOutWhenBlurred.test.ts +580 -0
- package/reactHooks/usePluginConfiguration.ts +2 -2
- package/reactHooks/utils/__tests__/index.test.js +1 -1
- package/reactHooks/utils/index.ts +3 -2
- package/rectUtils/__tests__/index.test.ts +549 -0
- package/rectUtils/index.ts +2 -2
- package/refreshUtils/RefreshCoordinator/__tests__/refreshCoordinator.test.ts +206 -0
- package/refreshUtils/RefreshCoordinator/index.ts +245 -0
- package/refreshUtils/RefreshCoordinator/utils/__tests__/getDataRefreshConfig.test.ts +104 -0
- package/refreshUtils/RefreshCoordinator/utils/index.ts +29 -0
- package/riverComponetsMeasurementProvider/index.tsx +12 -8
- package/screenPickerUtils/__tests__/index.test.ts +333 -0
- package/screenState/__tests__/index.test.ts +1 -1
- package/screenUtils/index.ts +3 -0
- package/searchUtils/const.ts +7 -0
- package/searchUtils/index.ts +3 -0
- package/stringUtils/index.ts +1 -1
- package/testUtils/index.tsx +30 -21
- package/time/__tests__/BackgroundTimer.test.ts +156 -0
- package/time/__tests__/Timer.test.ts +236 -0
- package/typeGuards/__tests__/isString.test.ts +21 -0
- package/typeGuards/index.ts +4 -0
- package/utils/__tests__/mergeRight.test.ts +48 -0
- package/utils/__tests__/path.test.ts +7 -0
- package/utils/__tests__/selectors.test.ts +124 -0
- package/utils/index.ts +13 -0
- package/utils/mergeRight.ts +5 -0
- package/utils/path.ts +6 -3
- package/utils/pathOr.ts +5 -1
- package/utils/selectors.ts +46 -0
- package/zappFrameworkUtils/HookCallback/callbackNavigationAction.ts +1 -1
- package/zappFrameworkUtils/HookCallback/hookCallbackManifestExtensions.config.js +1 -1
- package/zappFrameworkUtils/loginPluginUtils.ts +1 -1
- package/reactHooks/componentsMap/index.ts +0 -55
- package/reactHooks/feed/__mocks__/usePipesCacheReset.ts +0 -1
- package/reactHooks/feed/__tests__/useFeedRefresh.test.tsx +0 -75
- package/reactHooks/feed/useFeedRefresh.tsx +0 -65
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { mobileActionButtonsContainer } from "..";
|
|
2
|
+
|
|
3
|
+
describe("mobileActionButtonsContainer", () => {
|
|
4
|
+
it("generates container fields with inferred conditionals", () => {
|
|
5
|
+
const result = mobileActionButtonsContainer({
|
|
6
|
+
label: "Mobile Buttons Container",
|
|
7
|
+
description: "container",
|
|
8
|
+
defaults: {
|
|
9
|
+
buttonsEnabled: false,
|
|
10
|
+
position: ["over_image", "text_label_1", "text_label_2"],
|
|
11
|
+
align: "left",
|
|
12
|
+
overImagePosition: "bottom_left",
|
|
13
|
+
marginTop: 0,
|
|
14
|
+
marginRight: 20,
|
|
15
|
+
marginBottom: 0,
|
|
16
|
+
marginLeft: 20,
|
|
17
|
+
stacking: "horizontal",
|
|
18
|
+
horizontalGutter: 8,
|
|
19
|
+
verticalGutter: 8,
|
|
20
|
+
independentStyles: true,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
expect(result.group).toBe(true);
|
|
25
|
+
expect(result.label).toBe("Mobile Buttons Container");
|
|
26
|
+
|
|
27
|
+
const enabledField = result.fields.find(
|
|
28
|
+
(field) => field.key === "mobile_buttons_container_buttons_enabled"
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
expect(enabledField).toBeTruthy();
|
|
32
|
+
expect(enabledField.type).toBe("switch");
|
|
33
|
+
|
|
34
|
+
const positionField = result.fields.find(
|
|
35
|
+
(field) => field.key === "mobile_buttons_container_position"
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
expect(positionField.options).toEqual([
|
|
39
|
+
"over_image",
|
|
40
|
+
"text_label_1",
|
|
41
|
+
"text_label_2",
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
expect(positionField.conditional_fields).toEqual([
|
|
45
|
+
{
|
|
46
|
+
key: "styles/mobile_buttons_container_buttons_enabled",
|
|
47
|
+
condition_value: true,
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
const overImagePositionField = result.fields.find(
|
|
52
|
+
(field) => field.key === "mobile_buttons_container_over_image_position"
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
expect(overImagePositionField.rules).toBe("all_conditions");
|
|
56
|
+
|
|
57
|
+
expect(overImagePositionField.conditional_fields).toEqual([
|
|
58
|
+
{
|
|
59
|
+
key: "styles/mobile_buttons_container_buttons_enabled",
|
|
60
|
+
condition_value: true,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
key: "styles/mobile_buttons_container_position",
|
|
64
|
+
condition_value: "over_image",
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
const horizontalGutterField = result.fields.find(
|
|
69
|
+
(field) => field.key === "mobile_buttons_container_horizontal_gutter"
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
expect(horizontalGutterField.rules).toBe("all_conditions");
|
|
73
|
+
|
|
74
|
+
expect(horizontalGutterField.conditional_fields).toEqual([
|
|
75
|
+
{
|
|
76
|
+
key: "styles/mobile_buttons_container_buttons_enabled",
|
|
77
|
+
condition_value: true,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: "styles/mobile_buttons_container_stacking",
|
|
81
|
+
condition_value: "horizontal",
|
|
82
|
+
},
|
|
83
|
+
]);
|
|
84
|
+
|
|
85
|
+
const verticalGutterField = result.fields.find(
|
|
86
|
+
(field) => field.key === "mobile_buttons_container_vertical_gutter"
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
expect(verticalGutterField.rules).toBe("all_conditions");
|
|
90
|
+
|
|
91
|
+
expect(verticalGutterField.conditional_fields).toEqual([
|
|
92
|
+
{
|
|
93
|
+
key: "styles/mobile_buttons_container_buttons_enabled",
|
|
94
|
+
condition_value: true,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
key: "styles/mobile_buttons_container_stacking",
|
|
98
|
+
condition_value: "vertical",
|
|
99
|
+
},
|
|
100
|
+
]);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const { mobileActionButtonContainerFields } = require("../../keys");
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
isKeyHasSuffix,
|
|
5
|
+
toSnakeCase,
|
|
6
|
+
generateFieldsFromDefaultsWithoutPrefixedLabel,
|
|
7
|
+
getKeyWithPrefixGenerator,
|
|
8
|
+
} = require("../../_internals");
|
|
9
|
+
|
|
10
|
+
const { withConditional, createConditionalField } = require("../../fieldUtils");
|
|
11
|
+
|
|
12
|
+
const { fieldsGroup } = require("../../utils");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Builds the manifest group for the mobile action buttons container and wires
|
|
16
|
+
* child field visibility to the container-level toggles and layout selections.
|
|
17
|
+
*
|
|
18
|
+
* @param {object} options
|
|
19
|
+
* @param {string} options.label
|
|
20
|
+
* @param {string} options.description
|
|
21
|
+
* @param {object} options.defaults
|
|
22
|
+
* @returns {object}
|
|
23
|
+
*/
|
|
24
|
+
function mobileActionButtonsContainer({ label, description, defaults }) {
|
|
25
|
+
const containerKeyFromLabel = toSnakeCase(label); // "Mobile Buttons Container" -> "mobile_buttons_container"
|
|
26
|
+
|
|
27
|
+
const generatedFields = generateFieldsFromDefaultsWithoutPrefixedLabel(
|
|
28
|
+
label,
|
|
29
|
+
defaults,
|
|
30
|
+
mobileActionButtonContainerFields(defaults.position)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const keyPrefixGenerator = getKeyWithPrefixGenerator(containerKeyFromLabel);
|
|
34
|
+
|
|
35
|
+
const enabledKey = keyPrefixGenerator("buttons_enabled");
|
|
36
|
+
const positionKey = keyPrefixGenerator("position");
|
|
37
|
+
const stackingKey = keyPrefixGenerator("stacking");
|
|
38
|
+
|
|
39
|
+
const defaultConditions = [createConditionalField(enabledKey, true)];
|
|
40
|
+
|
|
41
|
+
const fields = generatedFields.map((field) => {
|
|
42
|
+
const key = field.key;
|
|
43
|
+
|
|
44
|
+
if (isKeyHasSuffix("buttons_enabled", key)) {
|
|
45
|
+
return field;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const conditions = [...defaultConditions];
|
|
49
|
+
|
|
50
|
+
// over_image_position depends on [positionKey: over_image]
|
|
51
|
+
if (isKeyHasSuffix("over_image_position", key)) {
|
|
52
|
+
conditions.push(createConditionalField(positionKey, "over_image"));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// horizontal_gutter depends on [stackingKey: horizontal]
|
|
56
|
+
if (isKeyHasSuffix("horizontal_gutter", key)) {
|
|
57
|
+
conditions.push(createConditionalField(stackingKey, "horizontal"));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// vertical_gutter depends on [stackingKey: vertical]
|
|
61
|
+
if (isKeyHasSuffix("vertical_gutter", key)) {
|
|
62
|
+
conditions.push(createConditionalField(stackingKey, "vertical"));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return withConditional(conditions)(field);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
return fieldsGroup(label, description, fields);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = {
|
|
72
|
+
mobileActionButtonsContainer,
|
|
73
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { buildMobileActionButtonGroups } from "..";
|
|
2
|
+
|
|
3
|
+
describe("buildMobileActionButtonGroups", () => {
|
|
4
|
+
it("builds the container and three button groups with shared defaults", () => {
|
|
5
|
+
const groups = buildMobileActionButtonGroups({
|
|
6
|
+
containerDefaults: {
|
|
7
|
+
position: ["over_image", "text_label_1", "text_label_2"],
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
expect(groups).toHaveLength(4);
|
|
12
|
+
|
|
13
|
+
expect(groups.map((group) => group.label)).toEqual([
|
|
14
|
+
"Mobile Buttons Container",
|
|
15
|
+
"Mobile Button 1",
|
|
16
|
+
"Mobile Button 2",
|
|
17
|
+
"Mobile Button 3",
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
const containerFields = groups[0].fields;
|
|
21
|
+
|
|
22
|
+
const positionField = containerFields.find(
|
|
23
|
+
(field) => field.key === "mobile_buttons_container_position"
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const buttonsEnabledField = containerFields.find(
|
|
27
|
+
(field) => field.key === "mobile_buttons_container_buttons_enabled"
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
expect(positionField.options).toEqual([
|
|
31
|
+
"over_image",
|
|
32
|
+
"text_label_1",
|
|
33
|
+
"text_label_2",
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
expect(buttonsEnabledField.initial_value).toBe(false);
|
|
37
|
+
|
|
38
|
+
const button1Fields = groups[1].fields;
|
|
39
|
+
|
|
40
|
+
const button1EnabledField = button1Fields.find(
|
|
41
|
+
(field) => field.key === "mobile_button_1_button_enabled"
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const button1AssignActionField = button1Fields.find(
|
|
45
|
+
(field) => field.key === "mobile_button_1_assign_action"
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const button1BackgroundColorField = button1Fields.find(
|
|
49
|
+
(field) => field.key === "mobile_button_1_background_color"
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(button1EnabledField.initial_value).toBe(true);
|
|
53
|
+
expect(button1AssignActionField.initial_value).toBe("navigation_action");
|
|
54
|
+
|
|
55
|
+
expect(button1BackgroundColorField.initial_value).toBe(
|
|
56
|
+
"rgba(254, 20, 72, 1)"
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const button2Fields = groups[2].fields;
|
|
60
|
+
|
|
61
|
+
const button2EnabledField = button2Fields.find(
|
|
62
|
+
(field) => field.key === "mobile_button_2_button_enabled"
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const button2AssignActionField = button2Fields.find(
|
|
66
|
+
(field) => field.key === "mobile_button_2_assign_action"
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
expect(button2EnabledField.initial_value).toBe(false);
|
|
70
|
+
expect(button2AssignActionField.initial_value).toBe("secondary_navigation");
|
|
71
|
+
|
|
72
|
+
const button3Fields = groups[3].fields;
|
|
73
|
+
|
|
74
|
+
const button3EnabledField = button3Fields.find(
|
|
75
|
+
(field) => field.key === "mobile_button_3_button_enabled"
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const button3AssignActionField = button3Fields.find(
|
|
79
|
+
(field) => field.key === "mobile_button_3_assign_action"
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
expect(button3EnabledField.initial_value).toBe(false);
|
|
83
|
+
|
|
84
|
+
expect(button3AssignActionField.initial_value).toBe(
|
|
85
|
+
"local_storage_favourites_action"
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("merges container, shared button, and per-button overrides", () => {
|
|
90
|
+
const groups = buildMobileActionButtonGroups({
|
|
91
|
+
containerDefaults: {
|
|
92
|
+
align: "center",
|
|
93
|
+
position: ["over_image"],
|
|
94
|
+
},
|
|
95
|
+
sharedButtonDefaults: {
|
|
96
|
+
assetAlignment: "right",
|
|
97
|
+
},
|
|
98
|
+
buttonOverrides: {
|
|
99
|
+
2: {
|
|
100
|
+
buttonEnabled: true,
|
|
101
|
+
assignAction: "downloads",
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const alignField = groups[0].fields.find(
|
|
107
|
+
(field) => field.key === "mobile_buttons_container_align"
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const button1AssetAlignmentField = groups[1].fields.find(
|
|
111
|
+
(field) => field.key === "mobile_button_1_asset_alignment"
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
const button2EnabledField = groups[2].fields.find(
|
|
115
|
+
(field) => field.key === "mobile_button_2_button_enabled"
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const button2AssignActionField = groups[2].fields.find(
|
|
119
|
+
(field) => field.key === "mobile_button_2_assign_action"
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
expect(alignField.initial_value).toBe("center");
|
|
123
|
+
expect(button1AssetAlignmentField.initial_value).toBe("right");
|
|
124
|
+
expect(button2EnabledField.initial_value).toBe(true);
|
|
125
|
+
expect(button2AssignActionField.initial_value).toBe("downloads");
|
|
126
|
+
});
|
|
127
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const DEFAULT_MOBILE_ACTION_BUTTONS_CONTAINER_DEFAULTS = {
|
|
2
|
+
buttonsEnabled: false,
|
|
3
|
+
|
|
4
|
+
align: "left",
|
|
5
|
+
overImagePosition: "bottom_left",
|
|
6
|
+
marginTop: 0,
|
|
7
|
+
marginRight: 20,
|
|
8
|
+
marginBottom: 0,
|
|
9
|
+
marginLeft: 20,
|
|
10
|
+
stacking: "horizontal",
|
|
11
|
+
horizontalGutter: 8,
|
|
12
|
+
verticalGutter: 8,
|
|
13
|
+
independentStyles: true,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const DEFAULT_MOBILE_ACTION_BUTTON_SHARED_DEFAULTS = {
|
|
17
|
+
displayMode: "dynamic",
|
|
18
|
+
width: 140,
|
|
19
|
+
contentsAlignment: "center",
|
|
20
|
+
backgroundColor: "rgba(62, 62, 62, 1)",
|
|
21
|
+
focusedBackgroundColor: "rgba(46, 46, 46, 1)",
|
|
22
|
+
borderColor: "rgba(0, 0, 0, 0)",
|
|
23
|
+
focusedBorderColor: "rgba(0, 0, 0, 0)",
|
|
24
|
+
borderSize: 0,
|
|
25
|
+
cornerRadius: 8,
|
|
26
|
+
paddingTop: 14,
|
|
27
|
+
paddingRight: 24,
|
|
28
|
+
paddingBottom: 14,
|
|
29
|
+
paddingLeft: 16,
|
|
30
|
+
assetEnabled: true,
|
|
31
|
+
actionAssetFlavour: "flavour_1",
|
|
32
|
+
assetAlignment: "left",
|
|
33
|
+
assetHeight: 24,
|
|
34
|
+
assetWidth: 24,
|
|
35
|
+
assetMarginTop: 0,
|
|
36
|
+
assetMarginRight: 6,
|
|
37
|
+
assetMarginBottom: 0,
|
|
38
|
+
assetMarginLeft: 0,
|
|
39
|
+
labelEnabled: true,
|
|
40
|
+
fontColor: "rgba(239, 239, 239, 1)",
|
|
41
|
+
focusedFontColor: "rgba(239, 239, 239, 1)",
|
|
42
|
+
iosFontFamily: "Ubuntu-Bold",
|
|
43
|
+
androidFontFamily: "Ubuntu-Bold",
|
|
44
|
+
fontSize: 15,
|
|
45
|
+
lineHeight: 24,
|
|
46
|
+
iosLetterSpacing: -0.2,
|
|
47
|
+
androidLetterSpacing: -0.2,
|
|
48
|
+
textTransform: "default",
|
|
49
|
+
marginTop: 0,
|
|
50
|
+
marginRight: 0,
|
|
51
|
+
marginBottom: 0,
|
|
52
|
+
marginLeft: 0,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const DEFAULT_MOBILE_ACTION_BUTTON_PRESETS = {
|
|
56
|
+
1: {
|
|
57
|
+
buttonEnabled: true,
|
|
58
|
+
assignAction: "navigation_action",
|
|
59
|
+
backgroundColor: "rgba(254, 20, 72, 1)",
|
|
60
|
+
focusedBackgroundColor: "rgba(213, 8, 54, 1)",
|
|
61
|
+
},
|
|
62
|
+
2: {
|
|
63
|
+
buttonEnabled: false,
|
|
64
|
+
assignAction: "secondary_navigation",
|
|
65
|
+
},
|
|
66
|
+
3: {
|
|
67
|
+
buttonEnabled: false,
|
|
68
|
+
assignAction: "local_storage_favourites_action",
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
module.exports = {
|
|
73
|
+
DEFAULT_MOBILE_ACTION_BUTTONS_CONTAINER_DEFAULTS,
|
|
74
|
+
DEFAULT_MOBILE_ACTION_BUTTON_SHARED_DEFAULTS,
|
|
75
|
+
DEFAULT_MOBILE_ACTION_BUTTON_PRESETS,
|
|
76
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const { mobileActionButtonsContainer } = require("../container");
|
|
2
|
+
const { mobileActionButton } = require("../button");
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
DEFAULT_MOBILE_ACTION_BUTTONS_CONTAINER_DEFAULTS,
|
|
6
|
+
DEFAULT_MOBILE_ACTION_BUTTON_SHARED_DEFAULTS,
|
|
7
|
+
DEFAULT_MOBILE_ACTION_BUTTON_PRESETS,
|
|
8
|
+
} = require("./defaults");
|
|
9
|
+
|
|
10
|
+
const CONTAINER_GROUP_LABEL = "Mobile Buttons Container"; // NOTE: used as key – "Mobile Buttons Container" -> "mobile_buttons_container"
|
|
11
|
+
|
|
12
|
+
const CONTAINER_GROUP_DESCRIPTION =
|
|
13
|
+
"Configuration for mobile action buttons container";
|
|
14
|
+
|
|
15
|
+
const BUTTON_GROUPS = [
|
|
16
|
+
{
|
|
17
|
+
index: 1,
|
|
18
|
+
label: "Mobile Button 1",
|
|
19
|
+
description: "Primary mobile action button",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
index: 2,
|
|
23
|
+
label: "Mobile Button 2",
|
|
24
|
+
description: "Secondary mobile action button",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
index: 3,
|
|
28
|
+
label: "Mobile Button 3",
|
|
29
|
+
description: "Tertiary mobile action button",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Builds the shared mobile action button manifest groups while letting each
|
|
35
|
+
* plugin supply only its supported insertion positions and explicit overrides.
|
|
36
|
+
*
|
|
37
|
+
* @param {object} options
|
|
38
|
+
* @param {object} [options.containerDefaults={}]
|
|
39
|
+
* @param {object} [options.sharedButtonDefaults={}]
|
|
40
|
+
* @param {Record<number, object>} [options.buttonOverrides={}]
|
|
41
|
+
* @returns {object[]}
|
|
42
|
+
*/
|
|
43
|
+
function buildMobileActionButtonGroups({
|
|
44
|
+
containerDefaults = {},
|
|
45
|
+
sharedButtonDefaults = {},
|
|
46
|
+
buttonOverrides = {},
|
|
47
|
+
}) {
|
|
48
|
+
const groups = [
|
|
49
|
+
mobileActionButtonsContainer({
|
|
50
|
+
label: CONTAINER_GROUP_LABEL,
|
|
51
|
+
description: CONTAINER_GROUP_DESCRIPTION,
|
|
52
|
+
defaults: {
|
|
53
|
+
...DEFAULT_MOBILE_ACTION_BUTTONS_CONTAINER_DEFAULTS,
|
|
54
|
+
...containerDefaults,
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
BUTTON_GROUPS.forEach(({ index, label, description }) => {
|
|
60
|
+
groups.push(
|
|
61
|
+
mobileActionButton({
|
|
62
|
+
isFirstButton: index === 1,
|
|
63
|
+
label,
|
|
64
|
+
description,
|
|
65
|
+
defaults: {
|
|
66
|
+
...DEFAULT_MOBILE_ACTION_BUTTON_SHARED_DEFAULTS,
|
|
67
|
+
...sharedButtonDefaults,
|
|
68
|
+
...DEFAULT_MOBILE_ACTION_BUTTON_PRESETS[index],
|
|
69
|
+
...(buttonOverrides[index] || {}),
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return groups;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
module.exports = {
|
|
79
|
+
buildMobileActionButtonGroups,
|
|
80
|
+
};
|
|
@@ -38,7 +38,7 @@ function tvActionButtonsContainer({ label, description, defaults }) {
|
|
|
38
38
|
generateFieldsFromDefaultsWithoutPrefixedLabel(
|
|
39
39
|
label,
|
|
40
40
|
defaults,
|
|
41
|
-
tvActionButtonContainerFields(defaults
|
|
41
|
+
tvActionButtonContainerFields(defaults.position)
|
|
42
42
|
)
|
|
43
43
|
);
|
|
44
44
|
|
|
@@ -24,6 +24,8 @@ describe("toNumber", () => {
|
|
|
24
24
|
it("return undefined if input is not a number", () => {
|
|
25
25
|
const inputs = [
|
|
26
26
|
"vfdvf",
|
|
27
|
+
"5n",
|
|
28
|
+
"-5n",
|
|
27
29
|
null,
|
|
28
30
|
undefined,
|
|
29
31
|
NaN,
|
|
@@ -41,4 +43,29 @@ describe("toNumber", () => {
|
|
|
41
43
|
expect(output).toBeUndefined();
|
|
42
44
|
});
|
|
43
45
|
});
|
|
46
|
+
|
|
47
|
+
describe("BigInt support", () => {
|
|
48
|
+
// Conditional test based on BigInt availability
|
|
49
|
+
const isBigIntSupported = typeof BigInt !== "undefined";
|
|
50
|
+
|
|
51
|
+
if (isBigIntSupported) {
|
|
52
|
+
it("converts BigInt to number when BigInt is supported", () => {
|
|
53
|
+
expect(toNumber(BigInt(5))).toBe(5);
|
|
54
|
+
expect(toNumber(BigInt(0))).toBe(0);
|
|
55
|
+
expect(toNumber(BigInt(-10))).toBe(-10);
|
|
56
|
+
expect(toNumber(BigInt(1000))).toBe(1000);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("handles large BigInt values that may lose precision", () => {
|
|
60
|
+
const largeBigInt = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1);
|
|
61
|
+
const result = toNumber(largeBigInt);
|
|
62
|
+
expect(result).toBe(Number(largeBigInt));
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
it("skips BigInt tests when BigInt is not supported", () => {
|
|
66
|
+
// Placeholder test to indicate BigInt is not available
|
|
67
|
+
expect(typeof BigInt).toBe("undefined");
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
});
|
|
44
71
|
});
|