@spaced-out/ui-design-system
Version:
Sense UI components library
84 lines (80 loc) • 2.84 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() !== '',
makeArbitraryValue = searchTerm => ({
key: searchTerm,
label: searchTerm,
arbitrary: true
}),
makeMultiArbitraryValue = searchTerm => {
const regex = /^(?=.*[,\n]).+$/;
if (regex.test(searchTerm)) {
return {
key: searchTerm,
label: searchTerm,
multiArbitrary: true
};
}
return undefined;
},
groupTitleOptions = [],
arbitraryGroup = {
groupTitle: '',
showLineDivider: false,
options: []
},
searchOptionsBy = (option, searchTerm) => {
const {
label,
key
} = option;
return key.toLowerCase().includes(searchTerm) || (label ? label.toLowerCase().includes(searchTerm) : false);
}
} = _ref;
const trimmedSearchTerm = (searchTerm || '').trim().toLowerCase();
const {
filteredOptions,
filteredGroupTitleOptions
} = (0, _useFilteredOptions.useFilteredOptions)({
searchTerm: trimmedSearchTerm,
options,
groupTitleOptions,
searchOptionsBy
});
// Find if an arbitrary option should be added
const arbitraryOption = allowArbitraryValues && trimmedSearchTerm && !filteredOptions.some(option => option.key === trimmedSearchTerm) && !filteredGroupTitleOptions.some(group => Array.isArray(group.options) && 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 = filteredGroupTitleOptions;
if (arbitraryOption) {
optionsWithArbitrary = [arbitraryOption, ...optionsWithArbitrary];
groupTitleOptionsWithArbitrary = [{
...arbitraryGroup,
options: [arbitraryOption]
}, ...groupTitleOptionsWithArbitrary];
}
if (multiArbitraryOption) {
optionsWithArbitrary = [multiArbitraryOption, ...optionsWithArbitrary];
groupTitleOptionsWithArbitrary = [{
...arbitraryGroup,
options: [multiArbitraryOption]
}, ...groupTitleOptionsWithArbitrary];
}
return {
optionsWithArbitrary,
groupTitleOptionsWithArbitrary
};
}