UNPKG

@orca-fe/hooks

Version:

React Hooks Collections

111 lines (110 loc) 4.45 kB
"use strict"; 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 }; }