@applicaster/zapp-react-native-utils
Version:
Applicaster Zapp React Native utilities package
146 lines (120 loc) • 3.63 kB
JavaScript
const R = require("ramda");
const { TV_ACTION_BUTTON_FIELDS } = require("../../keys");
const { tvActionButtonLabel } = require("../label");
const {
toSnakeCase,
generateFieldsFromDefaultsWithoutPrefixedLabel,
} = require("../../_internals");
const { fieldsGroup } = require("../../utils");
const appendTo = (key) => (config) => {
return {
...config,
conditional_fields: [
...(config.conditional_fields || []),
{
key,
condition_value: true,
},
],
};
};
const appendConditionalFieldForAssetEnabled = (prefix) => (configs) => {
const appendAssetEnabled = (predicate, label) => (config) => {
if (!predicate) {
return config;
}
return {
...config,
conditional_fields: [
{
key: `styles/${toSnakeCase(label)}_asset_enabled`,
condition_value: true,
},
],
};
};
const isAssetProp = (key) => {
return R.includes("_asset_", key) && !R.endsWith("_asset_enabled", key);
};
return configs.map((config) => {
return appendAssetEnabled(isAssetProp(config.key), prefix)(config);
});
};
const appendConditionalToFirst = (label) => (configs) => {
return configs.map((config, index) => {
if (index === 0) {
return appendTo(label)(config);
}
return config;
});
};
const appendConditionalToRest = (label) => (configs) => {
return configs.map((config, index) => {
if (index !== 0) {
return appendTo(label)(config);
}
return config;
});
};
const appendConditionalToAllExceptFirstTwo = (label) => (configs) => {
return configs.map((config, index) => {
if (index === 0 || index === 1) {
return config;
}
return appendTo(label)(config);
});
};
const applyAllConditions = (configs) => {
return configs.map((config) => {
const count = R.pathOr(0, ["conditional_fields", "length"], config);
if (count > 1) {
return { ...config, rules: "all_conditions" };
}
return config;
});
};
function tvActionButton({
label,
description,
defaults,
label1Defaults,
label2Defaults,
isFirstButton,
}) {
const buttonConfigs = generateFieldsFromDefaultsWithoutPrefixedLabel(
label,
defaults,
TV_ACTION_BUTTON_FIELDS
);
const label1 = `${label} Label 1`;
const label2 = `${label} Label 2`;
const label1Configs = tvActionButtonLabel(label1, label1Defaults);
const label2Configs = tvActionButtonLabel(label2, label2Defaults);
const buttonFields = R.compose(
appendConditionalFieldForAssetEnabled(label),
appendConditionalToFirst(
`styles/${toSnakeCase("tv_buttons_container")}_buttons_enabled`
),
appendConditionalToRest(`styles/${toSnakeCase(label)}_button_enabled`)
)(buttonConfigs);
const label1Fields = R.compose(
appendConditionalToFirst(`styles/${toSnakeCase(label)}_button_enabled`),
appendConditionalToRest(`styles/${toSnakeCase(label1)}_toggle`)
)(label1Configs);
const label2Fields = R.compose(
appendConditionalToFirst(`styles/${toSnakeCase(label)}_button_enabled`),
appendConditionalToRest(`styles/${toSnakeCase(label2)}_toggle`)
)(label2Configs);
const allFields = isFirstButton
? [...buttonFields, ...label1Fields, ...label2Fields]
: appendConditionalToAllExceptFirstTwo(
"styles/tv_buttons_container_independent_styles"
)([...buttonFields, ...label1Fields, ...label2Fields]);
return fieldsGroup(label, description, applyAllConditions(allFields));
}
module.exports = {
tvActionButton,
appendConditionalFieldForAssetEnabled,
appendConditionalToFirst,
appendConditionalToRest,
};