@gravity-ui/uikit
Version:
Gravity UI base styling and components
40 lines (39 loc) • 1.37 kB
JavaScript
import * as React from 'react';
const prepareParams = (selectedById) => Object.entries(selectedById).reduce((acc, [id, value]) => {
if (value) {
acc.push(id);
}
return acc;
}, []);
export const useControlledValue = ({ defaultValue = [], value: valueProps, onUpdate, }) => {
const [innerValue, setInnerValue] = React.useState(defaultValue);
const value = valueProps ?? innerValue;
const uncontrolled = !valueProps;
const result = React.useMemo(() => {
const selectedById = value.reduce((acc, val) => {
acc[val] = true;
return acc;
}, {});
const setSelected = (payload) => {
const nextValue = typeof payload === 'function' ? payload(selectedById) : payload;
const preparedValue = prepareParams(nextValue);
if (uncontrolled) {
setInnerValue(preparedValue);
}
else {
onUpdate?.(preparedValue);
}
};
return {
value,
selectedById,
setSelected,
/**
* Available only if `uncontrolled` component valiant
*/
setInnerValue: uncontrolled ? setInnerValue : undefined,
};
}, [onUpdate, uncontrolled, value]);
return result;
};
//# sourceMappingURL=useControlledValue.js.map