@orca-fe/hooks
Version:
React Hooks Collections
111 lines (110 loc) • 4.45 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useObjHistoryMgr;
exports.getHistoryModifiedKeys = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _useMemorizedFn = _interopRequireDefault(require("./useMemorizedFn"));
var modifiedKeys = Symbol('modifiedKeys');
var getHistoryModifiedKeys = exports.getHistoryModifiedKeys = function getHistoryModifiedKeys(obj) {
return new Set(obj[modifiedKeys] || []);
};
function useObjHistoryMgr(defaultValue) {
// defaultValue
var _useState = (0, _react.useState)(function () {
return {
history: defaultValue ? [defaultValue] : [],
current: 0
};
}),
_useState2 = (0, _slicedToArray2.default)(_useState, 1),
_defaultValue = _useState2[0];
var currentRef = (0, _react.useRef)(0);
var _useState3 = (0, _react.useState)(_defaultValue),
_useState4 = (0, _slicedToArray2.default)(_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 = (0, _useMemorizedFn.default)(function (value) {
setHistory(function (_ref) {
var _currentValue$modifie;
var historyArr = _ref.history,
current = _ref.current;
var currentValue = historyArr[current];
var newValue = (0, _objectSpread4.default)((0, _objectSpread4.default)((0, _objectSpread4.default)({}, currentValue), value), {}, (0, _defineProperty2.default)({}, modifiedKeys, [].concat((0, _toConsumableArray2.default)((_currentValue$modifie = currentValue[modifiedKeys]) !== null && _currentValue$modifie !== void 0 ? _currentValue$modifie : []), (0, _toConsumableArray2.default)(Object.keys(value)))));
var newHistory = {
history: historyArr.slice(0, current).concat([newValue]),
current: current
};
currentRef.current = newHistory.current;
return newHistory;
});
});
var setValue = (0, _useMemorizedFn.default)(function (value) {
// state 和 ref 中的 current 不匹配,说明执行了多次 setValue,调用 replace 来合并
if (history.current !== currentRef.current) {
replaceValue(value);
} else {
setHistory(function (oldState) {
var historyArr = oldState.history,
current = oldState.current;
var currentValue = historyArr[current];
var newValue = (0, _objectSpread4.default)((0, _objectSpread4.default)((0, _objectSpread4.default)({}, currentValue), value), {}, (0, _defineProperty2.default)({}, modifiedKeys, (0, _toConsumableArray2.default)(Object.keys(value))));
var newHistory = {
history: historyArr.slice(0, current + 1).concat([newValue]),
current: current + 1
};
currentRef.current = newHistory.current;
return newHistory;
});
}
});
var reset = (0, _useMemorizedFn.default)(function (value) {
setHistory(function () {
var newValue = (0, _objectSpread4.default)({}, _defaultValue);
if (value) {
newValue.history = [value];
}
return newValue;
});
});
var go = (0, _useMemorizedFn.default)(function (num) {
setHistory(function (_ref2) {
var historyArr = _ref2.history,
current = _ref2.current;
var newIndex = Math.max(0, Math.min(historyArr.length - 1, current + num));
return {
history: historyArr,
current: newIndex
};
});
});
var back = (0, _useMemorizedFn.default)(function () {
go(-1);
});
var forward = (0, _useMemorizedFn.default)(function () {
go(1);
});
return {
value: currentValue,
setValue: setValue,
replaceValue: replaceValue,
reset: reset,
go: go,
back: back,
forward: forward,
backLength: backLength,
forwardLength: forwardLength
};
}