@spaced-out/ui-design-system
Version:
Sense UI components library
97 lines (93 loc) • 3.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useArbitraryOptionAddition = useArbitraryOptionAddition;
var _useFilteredOptions = require("../useFilteredOptions");
function useArbitraryOptionAddition(_ref) {
let {
searchTerm,
options = [],
excludedKeys = [],
allowArbitraryValues = true,
allowMultiArbitraryValues = false,
validateArbitraryValue = value => value.trim() !== '',
// $FlowFixMe[incompatible-return] - Object literal is compatible with V due to type constraint
makeArbitraryValue = searchTerm => ({
key: searchTerm,
label: searchTerm,
arbitrary: true
}),
// $FlowFixMe[incompatible-return] - Object literal is compatible with V due to type constraint
makeMultiArbitraryValue = searchTerm => {
const regex = /^(?=.*[,\n]).+$/s;
if (regex.test(searchTerm)) {
// $FlowFixMe - Object literal is compatible with V due to type constraint
return {
key: searchTerm,
label: searchTerm,
multiArbitrary: true
};
}
},
groupTitleOptions = [],
arbitraryGroup = {
groupTitle: '',
showLineDivider: false,
options: []
},
searchOptionsBy = (option, searchTerm) => {
// $FlowFixMe
const {
label,
key
} = option;
return key.toLowerCase().includes(searchTerm) || label.toLowerCase().includes(searchTerm);
}
} = _ref;
const trimmedSearchTerm = (searchTerm || '').trim().toLowerCase();
const {
filteredOptions,
filteredGroupTitleOptions
} = (0, _useFilteredOptions.useFilteredOptions)({
searchTerm: trimmedSearchTerm,
options,
// $FlowFixMe[incompatible-call]
groupTitleOptions,
searchOptionsBy
});
// Find if an arbitrary option should be added
const arbitraryOption = allowArbitraryValues && trimmedSearchTerm &&
// $FlowFixMe - Array methods are valid here
!filteredOptions.some(option => option.key === trimmedSearchTerm) &&
// $FlowFixMe - Array methods are valid here
!filteredGroupTitleOptions.some(group => Array.isArray(group.options) &&
// $FlowFixMe- option has key property
group.options.some(option => option.key === trimmedSearchTerm)) && !excludedKeys.includes(trimmedSearchTerm) && validateArbitraryValue(trimmedSearchTerm) && makeArbitraryValue(trimmedSearchTerm);
// Find if a multi-arbitrary option should be added
const multiArbitraryOption = allowMultiArbitraryValues && trimmedSearchTerm && makeMultiArbitraryValue(trimmedSearchTerm);
// Compose the results
let optionsWithArbitrary = filteredOptions;
let groupTitleOptionsWithArbitrary = groupTitleOptions;
if (arbitraryOption) {
// $FlowFixMe[incompatible-type] - Array spread is valid here
optionsWithArbitrary = [arbitraryOption, ...optionsWithArbitrary];
groupTitleOptionsWithArbitrary = [{
...arbitraryGroup,
options: [arbitraryOption]
}, ...groupTitleOptionsWithArbitrary];
}
if (multiArbitraryOption) {
// $FlowFixMe[incompatible-type] - Array spread is valid here
optionsWithArbitrary = [multiArbitraryOption, ...optionsWithArbitrary];
groupTitleOptionsWithArbitrary = [{
...arbitraryGroup,
options: [multiArbitraryOption]
}, ...groupTitleOptionsWithArbitrary];
}
// $FlowFixMe[incompatible-return]
return {
optionsWithArbitrary,
groupTitleOptionsWithArbitrary
};
}