UNPKG

@react-hookz/web

Version:

React hooks done right, for browser and SSR.

42 lines (41 loc) 2.03 kB
"use strict"; 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;