/* eslint-disable react-hooks/exhaustive-deps */ import { Dispatch, SetStateAction, useCallback, useRef } from "react"; import { isFunction } from "@reins/utils"; import { useForceUpdate } from "hooks"; import { UseBooleanOutput } from "./use-boolean.types"; /** * * @kind 12-State */ export const useBoolean = (initialValue = false, asRef = false): UseBooleanOutput => { const rerender = useForceUpdate(); const valueRef = useRef(initialValue); const asRefRef = useRef(asRef); asRefRef.current = asRef; const handleValue = useCallback((value: boolean) => { valueRef.current = value; if (!asRefRef.current) rerender(); }, []); const toggle = useCallback(() => handleValue(!valueRef.current), []); const setTruthy = useCallback(() => handleValue(true), []); const setFalsy = useCallback(() => handleValue(false), []); const setValue: Dispatch> = useCallback((value) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any handleValue(isFunction(value) ? (value as any)(valueRef.current) : value); }, []); return { value: valueRef.current, valueRef, setValue, toggle, setTruthy, setFalsy }; };