UNPKG

@orca-fe/hooks

Version:

React Hooks Collections

103 lines 3.26 kB
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 }; }