UNPKG

@spaced-out/ui-design-system

Version:
97 lines (93 loc) 3.44 kB
"use strict"; 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 }; }