UNPKG

use-smartvalue

Version:

A custom React hook to manage values with either useState or useRef.

52 lines (51 loc) 2.66 kB
import { useState, useRef, useCallback, useMemo } from "react"; export var useSmartValue = function (options) { var _a = options || {}, _b = _a.useRef, shouldUseRef = _b === void 0 ? false : _b, initialValue = _a.initialValue; var initialRef = useRef(initialValue); if (shouldUseRef) { var valueRef_1 = useRef(initialValue); var previousRef_1 = useRef(undefined); var get_1 = useCallback(function () { return valueRef_1.current; }, [valueRef_1]); var getPrevious_1 = useCallback(function () { return previousRef_1.current; }, [previousRef_1]); var set_1 = useCallback(function (value) { previousRef_1.current = valueRef_1.current; if (typeof value === "function") { valueRef_1.current = value(valueRef_1.current); } else { valueRef_1.current = value; } }, [valueRef_1]); var getInitial_1 = useCallback(function () { return initialRef.current; }, [initialRef]); var reset_1 = useCallback(function () { previousRef_1.current = valueRef_1.current; valueRef_1.current = initialRef.current; }, [valueRef_1, initialRef]); return useMemo(function () { return ({ get: get_1, set: set_1, getInitial: getInitial_1, reset: reset_1, getPrevious: getPrevious_1 }); }, [get_1, set_1, getInitial_1, reset_1, getPrevious_1]); } else { var _c = useState(initialValue), value_1 = _c[0], setValue_1 = _c[1]; var previousRef_2 = useRef(undefined); var get_2 = useCallback(function () { return value_1; }, [value_1]); var getPrevious_2 = useCallback(function () { return previousRef_2.current; }, [previousRef_2]); var set_2 = useCallback(function (newValue) { setValue_1(function (prev) { previousRef_2.current = prev; if (typeof newValue === "function") { return newValue(prev); } else { return newValue; } }); }, [setValue_1]); var getInitial_2 = useCallback(function () { return initialRef.current; }, [initialRef]); var reset_2 = useCallback(function () { setValue_1(function (prev) { previousRef_2.current = prev; return initialRef.current; }); }, [setValue_1, initialRef]); return useMemo(function () { return ({ get: get_2, set: set_2, getInitial: getInitial_2, reset: reset_2, getPrevious: getPrevious_2 }); }, [get_2, set_2, getInitial_2, reset_2, getPrevious_2]); } };