use-smartvalue
Version:
A custom React hook to manage values with either useState or useRef.
52 lines (51 loc) • 2.66 kB
JavaScript
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]);
}
};