@wordpress/components
Version:
UI components for WordPress.
47 lines (45 loc) • 1.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useControlledValue = useControlledValue;
var _element = require("@wordpress/element");
/**
* WordPress dependencies
*/
/**
* Simplified and improved implementation of useControlledState.
*
* @param props
* @param props.defaultValue
* @param props.value
* @param props.onChange
* @return The controlled value and the value setter.
*/
function useControlledValue({
defaultValue,
onChange,
value: valueProp
}) {
const hasValue = typeof valueProp !== 'undefined';
const initialValue = hasValue ? valueProp : defaultValue;
const [state, setState] = (0, _element.useState)(initialValue);
const value = hasValue ? valueProp : state;
const uncontrolledSetValue = (0, _element.useCallback)((nextValue, ...args) => {
setState(nextValue);
onChange?.(nextValue, ...args);
}, [onChange]);
let setValue;
if (hasValue && typeof onChange === 'function') {
// Controlled mode.
setValue = onChange;
} else if (!hasValue && typeof onChange === 'function') {
// Uncontrolled mode, plus forwarding to the onChange prop.
setValue = uncontrolledSetValue;
} else {
// Uncontrolled mode, only update internal state.
setValue = setState;
}
return [value, setValue];
}
//# sourceMappingURL=use-controlled-value.js.map