@gravity-ui/uikit
Version:
Gravity UI base styling and components
45 lines (44 loc) • 1.67 kB
JavaScript
import * as React from 'react';
import get from "lodash/get.js";
import { FLATTEN_KEY } from "../../constants.js";
import { getFilteredFlattenOptions, getFlattenOptions } from "../../utils.js";
function isFlattenOptions(options) {
return get(options, [FLATTEN_KEY]);
}
/**
* Helps to manage options data before passing it into `Select` component.
*
* @param {SelectOptions} options
* @returns preprared options for `Select` component.
*
* @example
*
* import {Select, getSelectFilteredOptions, useSelectOptions} from '@gravity-ui/uikit';
*
* function App() {
* const options = useSelectOptions({options: [{value: '1'}, {value: '2'}]});
* const filteredOptions = getSelectFilteredOptions(options);
* // Do some staff with prepared options
* return <Select options={options} />
* }
*/
export function getSelectFilteredOptions(options) {
if (!isFlattenOptions(options)) {
throw Error('You should use options generated by useSelectOptions hook');
}
return get(options, [FLATTEN_KEY, 'filteredOptions']);
}
export function useSelectOptions(props) {
const { filter = '', filterable, filterOption } = props;
const options = React.useMemo(() => {
return isFlattenOptions(props.options)
? props.options
: getFlattenOptions(props.options);
}, [props.options]);
const filteredOptions = React.useMemo(() => {
return filterable ? getFilteredFlattenOptions({ options, filter, filterOption }) : options;
}, [filter, filterable, filterOption, options]);
options[FLATTEN_KEY]['filteredOptions'] = filteredOptions;
return options;
}
//# sourceMappingURL=index.js.map