react-component-managers
Version:
react-component-managers React component
47 lines (43 loc) • 1.6 kB
JavaScript
import { unstable_batchedUpdates as batchedUpdates } from 'react-dom';
import createTimeoutManager from './timeoutManager';
import createMountManager from './mountManager';
export function callFocusEventHandler(inst, focused, e) {
var handler = inst.props[focused ? 'onFocus' : 'onBlur'];
handler && handler(e);
}
export default function createFocusManager(instance, _temp) {
var _ref = _temp === void 0 ? {} : _temp,
willHandle = _ref.willHandle,
didHandle = _ref.didHandle,
onChange = _ref.onChange,
_ref$isDisabled = _ref.isDisabled,
isDisabled = _ref$isDisabled === void 0 ? function () {
return !!instance.props.disabled;
} : _ref$isDisabled;
var lastFocused;
var timeouts = createTimeoutManager(instance);
var isMounted = createMountManager(instance);
function _handleFocus(focused, event) {
if (event && event.persist) event.persist();
if (willHandle && willHandle(focused, event) === false) return;
timeouts.set('focus', function () {
batchedUpdates(function () {
if (focused !== lastFocused) {
if (didHandle) didHandle.call(instance, focused, event); // only fire a change when unmounted if its a blur
if (isMounted() || !focused) {
lastFocused = focused;
onChange && onChange(focused, event);
}
}
});
});
}
return {
handleBlur: function handleBlur(event) {
if (!isDisabled()) _handleFocus(false, event);
},
handleFocus: function handleFocus(event) {
if (!isDisabled()) _handleFocus(true, event);
}
};
}