@orca-fe/hooks
Version:
React Hooks Collections
103 lines • 3.26 kB
JavaScript
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import { useRef, useState } from 'react';
import useMemoizedFn from "./useMemorizedFn";
var modifiedKeys = Symbol('modifiedKeys');
export var getHistoryModifiedKeys = obj => new Set(obj[modifiedKeys] || []);
export default function useObjHistoryMgr(defaultValue) {
// defaultValue
var _useState = useState(() => ({
history: defaultValue ? [defaultValue] : [],
current: 0
})),
_useState2 = _slicedToArray(_useState, 1),
_defaultValue = _useState2[0];
var currentRef = useRef(0);
var _useState3 = useState(_defaultValue),
_useState4 = _slicedToArray(_useState3, 2),
history = _useState4[0],
setHistory = _useState4[1];
var current = history.current,
historyArr = history.history;
var currentValue = historyArr[current];
currentRef.current = current;
var backLength = current;
var forwardLength = historyArr.length - current - 1;
var replaceValue = useMemoizedFn(value => {
setHistory(({
history: historyArr,
current
}) => {
var _currentValue$modifie;
var currentValue = historyArr[current];
var newValue = _objectSpread(_objectSpread(_objectSpread({}, currentValue), value), {}, {
[modifiedKeys]: [...((_currentValue$modifie = currentValue[modifiedKeys]) !== null && _currentValue$modifie !== void 0 ? _currentValue$modifie : []), ...Object.keys(value)]
});
var newHistory = {
history: historyArr.slice(0, current).concat([newValue]),
current
};
currentRef.current = newHistory.current;
return newHistory;
});
});
var setValue = useMemoizedFn(value => {
// state 和 ref 中的 current 不匹配,说明执行了多次 setValue,调用 replace 来合并
if (history.current !== currentRef.current) {
replaceValue(value);
} else {
setHistory(oldState => {
var historyArr = oldState.history,
current = oldState.current;
var currentValue = historyArr[current];
var newValue = _objectSpread(_objectSpread(_objectSpread({}, currentValue), value), {}, {
[modifiedKeys]: [...Object.keys(value)]
});
var newHistory = {
history: historyArr.slice(0, current + 1).concat([newValue]),
current: current + 1
};
currentRef.current = newHistory.current;
return newHistory;
});
}
});
var reset = useMemoizedFn(value => {
setHistory(() => {
var newValue = _objectSpread({}, _defaultValue);
if (value) {
newValue.history = [value];
}
return newValue;
});
});
var go = useMemoizedFn(num => {
setHistory(({
history: historyArr,
current
}) => {
var newIndex = Math.max(0, Math.min(historyArr.length - 1, current + num));
return {
history: historyArr,
current: newIndex
};
});
});
var back = useMemoizedFn(() => {
go(-1);
});
var forward = useMemoizedFn(() => {
go(1);
});
return {
value: currentValue,
setValue,
replaceValue,
reset,
go,
back,
forward,
backLength,
forwardLength
};
}