@react-hookz/web
Version:
React hooks done right, for browser and SSR.
42 lines (41 loc) • 2.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useToggle = void 0;
var react_1 = require("react");
var __1 = require("..");
var resolveHookState_1 = require("../util/resolveHookState");
/**
* Like `useSafeState`, but can only become `true` or `false`.
*
* State setter, in case called without arguments, will change the state to opposite. React
* synthetic events are ignored by default so state setter can be used as event handler directly,
* such behaviour can be changed by setting 2nd parameter to `false`.
*/
function useToggle(initialState, ignoreReactEvents) {
if (initialState === void 0) { initialState = false; }
if (ignoreReactEvents === void 0) { ignoreReactEvents = true; }
// We don't use useReducer (which would end up with less code), because exposed
// action does not provide functional updates feature.
// Therefore, we have to create and expose our own state setter with
// toggle logic.
var _a = (0, __1.useSafeState)(initialState), state = _a[0], setState = _a[1];
var ignoreReactEventsRef = (0, __1.useSyncedRef)(ignoreReactEvents);
return [
state,
(0, react_1.useCallback)(function (nextState) {
setState(function (prevState) {
if (typeof nextState === 'undefined' ||
(ignoreReactEventsRef.current &&
typeof nextState === 'object' &&
(nextState.constructor.name === 'SyntheticBaseEvent' ||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,no-underscore-dangle,@typescript-eslint/no-explicit-any
typeof nextState._reactName === 'string'))) {
return !prevState;
}
return Boolean((0, resolveHookState_1.resolveHookState)(nextState, prevState));
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []),
];
}
exports.useToggle = useToggle;