@leankylin-sheet/react 5.2.77 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,7 @@ export type SetContextOptions = {
17
17
  declare const WorkbookContext: React.Context<{
18
18
  context: Context;
19
19
  setContext: (recipe: (ctx: Context) => void, options?: SetContextOptions) => void;
20
+ setScrollContext: (recipe: (ctx: Context) => void) => void;
20
21
  settings: Required<Settings>;
21
22
  refs: RefValues;
22
23
  handleUndo: () => void;
package/dist/index.esm.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { defaultContext, defaultSettings, getSheetIndex, colLocationByIndex, fixPositionOnFrozenCells, colLocation, getFlowdata, isAllowEdit, handleColumnHeaderMouseDown, handleColSizeHandleMouseDown, handleColFreezeHandleMouseDown, handleContextMenu, selectTitlesMap, selectTitlesRange, fixColumnStyleOverflowInFreeze, rowLocationByIndex, rowLocation, handleRowHeaderMouseDown, handleRowSizeHandleMouseDown, handleRowFreezeHandleMouseDown, fixRowStyleOverflowInFreeze, functionHTMLGenerate, locale, getCellValue, createRangeHightlight, isInlineStringCell, getInlineStringHTML, valueShowEs, escapeHTMLTag, escapeScriptTag, isShowHidenCR, cancelNormalSelected, moveHighlightCell, updateCell, israngeseleciton, handleFormulaInput, onSearchDialogMoveStart, replaceAll, replace, searchAll, searchNext, changeSheet, normalizeSelection, scrollToHighlightCell, chatatABC, isLinkValid, getRangetxt, goToLink, replaceHtml, removeHyperlink, onRangeSelectionModalMoveStart, saveHyperlink, createFilterOptions, onImageMoveStart, onImageResizeStart, showComments, setEditingComment, onCommentBoxMoveStart, onCommentBoxResizeStart, confirmMessage, getRangeByTxt, getDropdownList, setCellValue, setConditionRules, mergeBorder, setDropcownValue, handleCellAreaMouseDown, handleCellAreaMouseMove, handleCellAreaDragOver, handleCellDrop, handleCellAreaDoubleClick, selectAll, showLinkCard, getCellRowColumn, getCellHyperlink, handleOverlayMouseMove, handleOverlayMouseUp, handleKeydownForZoom, handleOverlayTouchStart, handleOverlayTouchMove, handleOverlayTouchEnd, onCellsMoveStart, createDropCellRange, handleDropCellDoubleClick, updateContextWithSheetData, updateContextWithCanvas, initFreeze, Canvas, handleGlobalWheel, setCaretPosition, getDataArr, updateMoreCell, getRegStr, getOptionValue, getSelectRange, applyLocation, updateItem, update, normalizedCellAttr, updateFormat, handleTextSize, handleHorizontalAlign, handleVerticalAlign, handleScreenShot, showImgChooser, insertImage, editComment, deleteComment, showHideComment, showHideAllComments, newComment, handleSum, autoSelectionFormula, handleMerge, handleBorder, handleFreeze, handleSort, createFilter, clearFilter, toolbarItemSelectedFunc, toolbarItemClickHandler, handleTextColor, handleTextBackground, getDataBySelectionNoCopy, getInlineStringNoStyle, rangeHightlightselected, editSheetName, setNextSheet, MAX_ZOOM_RATIO, MIN_ZOOM_RATIO, addSheet, indexToColumnChar, sortSelection, handleCopy, insertRowCol, deleteRowCol, hideSelected, showSelected, api, removeActiveImage, deleteSelectedCellText, jfrefreshgrid, handleLink, deleteSheet, opToPatch, orderbydatafiler, getFilterColumnValues, getFilterColumnColors, saveFilter, cancelActiveImgItem, patchToOp, filterPatch, inverseRowColOptions, ensureSheetIndex, initSheetIndex, handleGlobalKeyDown, handlePasteByLeanklin, groupValuesRefresh } from '@leankylin-sheet/core';
2
+ import { useInViewport, useMemoizedFn, useThrottleFn } from 'ahooks';
2
3
  import React, { useContext, useRef, useState, useMemo, useCallback, useEffect, useLayoutEffect, useImperativeHandle } from 'react';
3
4
  import produce, { applyPatches, enablePatches, produceWithPatches } from 'immer';
4
5
  import _ from 'lodash';
5
- import { useInViewport, useMemoizedFn, useThrottleFn } from 'ahooks';
6
6
  import { createPortal } from 'react-dom';
7
7
 
8
8
  function _iterableToArrayLimit(r, l) {
@@ -556,6 +556,7 @@ var defaultRefs = {
556
556
  var WorkbookContext = /*#__PURE__*/React.createContext({
557
557
  context: defaultContext(defaultRefs),
558
558
  setContext: function setContext() {},
559
+ setScrollContext: function setScrollContext() {},
559
560
  settings: defaultSettings,
560
561
  handleUndo: function handleUndo() {},
561
562
  handleRedo: function handleRedo() {},
@@ -1670,7 +1671,7 @@ var ScrollBar = function ScrollBar(_ref) {
1670
1671
  var _useContext = useContext(WorkbookContext),
1671
1672
  context = _useContext.context,
1672
1673
  refs = _useContext.refs,
1673
- setContext = _useContext.setContext;
1674
+ setScrollContext = _useContext.setScrollContext;
1674
1675
  var ref = axis === "x" ? refs.scrollbarX : refs.scrollbarY;
1675
1676
  var _useInViewport = useInViewport(ref),
1676
1677
  _useInViewport2 = _slicedToArray(_useInViewport, 1),
@@ -1703,11 +1704,11 @@ var ScrollBar = function ScrollBar(_ref) {
1703
1704
  className: "luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-".concat(axis),
1704
1705
  onScroll: function onScroll() {
1705
1706
  if (axis === "x") {
1706
- setContext(function (draftCtx) {
1707
+ setScrollContext(function (draftCtx) {
1707
1708
  draftCtx.scrollLeft = refs.scrollbarX.current.scrollLeft;
1708
1709
  });
1709
1710
  } else {
1710
- setContext(function (draftCtx) {
1711
+ setScrollContext(function (draftCtx) {
1711
1712
  draftCtx.scrollTop = refs.scrollbarY.current.scrollTop;
1712
1713
  });
1713
1714
  }
@@ -4350,9 +4351,7 @@ var SheetOverlay = function SheetOverlay() {
4350
4351
  }, [setContext, refs.globalCache, refs.cellInput, refs.cellArea, refs.fxInput, refs.canvas]);
4351
4352
  var debounceMouseMove = useMemoizedFn(function (e) {
4352
4353
  var nativeEvent = e.nativeEvent;
4353
- setContext(function (draftCtx) {
4354
- handleCellAreaMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellArea.current);
4355
- });
4354
+ handleCellAreaMouseMove(context, refs.globalCache, nativeEvent, refs.cellArea.current);
4356
4355
  });
4357
4356
  var debounceDragOver = useMemoizedFn(function (e) {
4358
4357
  var nativeEvent = e.nativeEvent;
@@ -4422,12 +4421,29 @@ var SheetOverlay = function SheetOverlay() {
4422
4421
  debouncedShowLinkCard(globalCache, rc.r, rc.c, false, true);
4423
4422
  }
4424
4423
  }, [debouncedShowLinkCard]);
4424
+ var lastHoverCellRef = useRef(null);
4425
4425
  var onMouseMove = useCallback(function (nativeEvent) {
4426
+ var _gc$commentBox, _gc$commentBox2, _gc$searchDialog, _gc$linkCard;
4427
+ var container = containerRef.current;
4428
+ var scrollX = refs.scrollbarX.current;
4429
+ var scrollY = refs.scrollbarY.current;
4430
+ if (!container || !scrollX || !scrollY) return;
4431
+ var gc = refs.globalCache;
4432
+ var isInteracting = !!context.luckysheet_scroll_status || !!context.luckysheet_select_status || !!context.luckysheet_rows_selected_status || !!context.luckysheet_cols_selected_status || !!context.luckysheet_cell_selected_move || !!context.luckysheet_cell_selected_extend || !!context.luckysheet_cols_change_size || !!context.luckysheet_rows_change_size || ((_gc$commentBox = gc.commentBox) === null || _gc$commentBox === void 0 ? void 0 : _gc$commentBox.movingId) != null || ((_gc$commentBox2 = gc.commentBox) === null || _gc$commentBox2 === void 0 ? void 0 : _gc$commentBox2.resizingId) != null || gc.image != null || ((_gc$searchDialog = gc.searchDialog) === null || _gc$searchDialog === void 0 ? void 0 : _gc$searchDialog.moveProps) != null || ((_gc$linkCard = gc.linkCard) === null || _gc$linkCard === void 0 ? void 0 : _gc$linkCard.rangeSelectionModal) != null;
4433
+ if (!isInteracting) {
4434
+ var rc = getCellRowColumn(context, nativeEvent, container, scrollX, scrollY);
4435
+ var last = lastHoverCellRef.current;
4436
+ var hoverChanged = rc == null ? last != null : last == null || last.r !== rc.r || last.c !== rc.c;
4437
+ if (!hoverChanged) {
4438
+ return;
4439
+ }
4440
+ lastHoverCellRef.current = rc !== null && rc !== void 0 ? rc : null;
4441
+ }
4426
4442
  setContext(function (draftCtx) {
4427
- overShowLinkCard(draftCtx, refs.globalCache, nativeEvent, containerRef.current, refs.scrollbarX.current, refs.scrollbarY.current);
4428
- handleOverlayMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellInput.current, refs.scrollbarX.current, refs.scrollbarY.current, containerRef.current, refs.fxInput.current);
4443
+ overShowLinkCard(draftCtx, refs.globalCache, nativeEvent, container, scrollX, scrollY);
4444
+ handleOverlayMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellInput.current, scrollX, scrollY, container, refs.fxInput.current);
4429
4445
  });
4430
- }, [overShowLinkCard, refs.cellInput, refs.fxInput, refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
4446
+ }, [overShowLinkCard, context, refs.cellInput, refs.fxInput, refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
4431
4447
  var onMouseUp = useCallback(function (nativeEvent) {
4432
4448
  setContext(function (draftCtx) {
4433
4449
  try {
@@ -5014,9 +5030,7 @@ var Sheet = function Sheet(_ref) {
5014
5030
  return false;
5015
5031
  }
5016
5032
  var onWheel = useCallback(function (e) {
5017
- setContext(function (draftCtx) {
5018
- handleGlobalWheel(draftCtx, e, refs.globalCache, refs.scrollbarX.current, refs.scrollbarY.current);
5019
- });
5033
+ handleGlobalWheel(context, e, refs.globalCache, refs.scrollbarX.current, refs.scrollbarY.current);
5020
5034
  if (e.deltaY === 0 && e.deltaX === 0) {
5021
5035
  return;
5022
5036
  }
@@ -5037,7 +5051,7 @@ var Sheet = function Sheet(_ref) {
5037
5051
  e.preventDefault();
5038
5052
  }
5039
5053
  }
5040
- }, [refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
5054
+ }, [context, refs.globalCache, refs.scrollbarX, refs.scrollbarY]);
5041
5055
  useEffect(function () {
5042
5056
  var container = containerRef.current;
5043
5057
  container === null || container === void 0 ? void 0 : container.addEventListener("wheel", onWheel);
@@ -11958,6 +11972,7 @@ var Workbook = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
11958
11972
  _useState2 = _slicedToArray(_useState, 2),
11959
11973
  context = _useState2[0],
11960
11974
  setContext = _useState2[1];
11975
+ var contextRef = useRef(context);
11961
11976
  var _useState3 = useState(null),
11962
11977
  _useState4 = _slicedToArray(_useState3, 2),
11963
11978
  moreToolbarItems = _useState4[0],
@@ -12062,64 +12077,81 @@ var Workbook = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
12062
12077
  }
12063
12078
  return cellData;
12064
12079
  }
12065
- var setContextWithProduce = useCallback(function (recipe) {
12080
+ var setContextWithProduce = useMemoizedFn(function (recipe) {
12066
12081
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12067
- setContext(function (ctx_) {
12068
- var _produceWithPatches = produceWithPatches(ctx_, concatProducer(recipe, triggerGroupValuesRefresh)),
12069
- _produceWithPatches2 = _slicedToArray(_produceWithPatches, 3),
12070
- result = _produceWithPatches2[0],
12071
- patches = _produceWithPatches2[1],
12072
- inversePatches = _produceWithPatches2[2];
12073
- if (patches.length > 0 && !options.noHistory) {
12074
- if (options.logPatch) {
12075
- console.info("patch", patches);
12076
- }
12077
- var filteredPatches = filterPatch(patches);
12078
- var filteredInversePatches = filterPatch(inversePatches);
12079
- if (filteredInversePatches.length > 0) {
12080
- options.id = ctx_.currentSheetId;
12081
- if (options.deleteSheetOp) {
12082
- var target = ctx_.luckysheetfile.filter(function (sheet) {
12083
- var _options$deleteSheetO;
12084
- return sheet.id === ((_options$deleteSheetO = options.deleteSheetOp) === null || _options$deleteSheetO === void 0 ? void 0 : _options$deleteSheetO.id);
12085
- });
12086
- if (target) {
12087
- var index = getSheetIndex(ctx_, options.deleteSheetOp.id);
12088
- options.deletedSheet = {
12089
- id: options.deleteSheetOp.id,
12090
- index: index,
12091
- value: _.cloneDeep(ctx_.luckysheetfile[index])
12092
- };
12093
- options.deletedSheet.value.celldata = dataToCelldata(options.deletedSheet.value.data);
12094
- delete options.deletedSheet.value.data;
12095
- options.deletedSheet.value.status = 0;
12096
- filteredInversePatches = [{
12097
- op: "add",
12098
- path: ["luckysheetfile", 0],
12099
- value: options.deletedSheet.value
12100
- }];
12101
- }
12102
- } else if (options.addSheetOp) {
12103
- options.addSheet = {};
12104
- options.addSheet.id = result.luckysheetfile[result.luckysheetfile.length - 1].id;
12105
- }
12106
- globalCache.current.undoList.push({
12107
- patches: filteredPatches,
12108
- inversePatches: filteredInversePatches,
12109
- options: options
12082
+ var ctx_ = contextRef.current;
12083
+ var _produceWithPatches = produceWithPatches(ctx_, concatProducer(recipe, triggerGroupValuesRefresh)),
12084
+ _produceWithPatches2 = _slicedToArray(_produceWithPatches, 3),
12085
+ result = _produceWithPatches2[0],
12086
+ patches = _produceWithPatches2[1],
12087
+ inversePatches = _produceWithPatches2[2];
12088
+ if (patches.length > 0 && !options.noHistory) {
12089
+ if (options.logPatch) {
12090
+ console.info("patch", patches);
12091
+ }
12092
+ var filteredPatches = filterPatch(patches);
12093
+ var filteredInversePatches = filterPatch(inversePatches);
12094
+ if (filteredInversePatches.length > 0) {
12095
+ options.id = ctx_.currentSheetId;
12096
+ if (options.deleteSheetOp) {
12097
+ var target = ctx_.luckysheetfile.filter(function (sheet) {
12098
+ var _options$deleteSheetO;
12099
+ return sheet.id === ((_options$deleteSheetO = options.deleteSheetOp) === null || _options$deleteSheetO === void 0 ? void 0 : _options$deleteSheetO.id);
12110
12100
  });
12111
- globalCache.current.redoList = [];
12112
- emitOp(result, filteredPatches, options);
12113
- }
12114
- } else {
12115
- var _patches$, _patches$$value, _ctx_$luckysheetfile;
12116
- if ((patches === null || patches === void 0 ? void 0 : (_patches$ = patches[0]) === null || _patches$ === void 0 ? void 0 : (_patches$$value = _patches$.value) === null || _patches$$value === void 0 ? void 0 : _patches$$value.length) < (ctx_ === null || ctx_ === void 0 ? void 0 : (_ctx_$luckysheetfile = ctx_.luckysheetfile) === null || _ctx_$luckysheetfile === void 0 ? void 0 : _ctx_$luckysheetfile.length)) {
12117
- reduceUndoList(result, ctx_);
12101
+ if (target) {
12102
+ var index = getSheetIndex(ctx_, options.deleteSheetOp.id);
12103
+ options.deletedSheet = {
12104
+ id: options.deleteSheetOp.id,
12105
+ index: index,
12106
+ value: _.cloneDeep(ctx_.luckysheetfile[index])
12107
+ };
12108
+ options.deletedSheet.value.celldata = dataToCelldata(options.deletedSheet.value.data);
12109
+ delete options.deletedSheet.value.data;
12110
+ options.deletedSheet.value.status = 0;
12111
+ filteredInversePatches = [{
12112
+ op: "add",
12113
+ path: ["luckysheetfile", 0],
12114
+ value: options.deletedSheet.value
12115
+ }];
12116
+ }
12117
+ } else if (options.addSheetOp) {
12118
+ options.addSheet = {};
12119
+ options.addSheet.id = result.luckysheetfile[result.luckysheetfile.length - 1].id;
12118
12120
  }
12121
+ globalCache.current.undoList.push({
12122
+ patches: filteredPatches,
12123
+ inversePatches: filteredInversePatches,
12124
+ options: options
12125
+ });
12126
+ globalCache.current.redoList = [];
12127
+ emitOp(result, filteredPatches, options);
12128
+ }
12129
+ } else {
12130
+ var _patches$, _patches$$value, _ctx_$luckysheetfile;
12131
+ if ((patches === null || patches === void 0 ? void 0 : (_patches$ = patches[0]) === null || _patches$ === void 0 ? void 0 : (_patches$$value = _patches$.value) === null || _patches$$value === void 0 ? void 0 : _patches$$value.length) < (ctx_ === null || ctx_ === void 0 ? void 0 : (_ctx_$luckysheetfile = ctx_.luckysheetfile) === null || _ctx_$luckysheetfile === void 0 ? void 0 : _ctx_$luckysheetfile.length)) {
12132
+ reduceUndoList(result, ctx_);
12133
+ }
12134
+ }
12135
+ contextRef.current = result;
12136
+ setContext(function (prev) {
12137
+ if (prev === ctx_) {
12138
+ return result;
12119
12139
  }
12140
+ var merged = applyPatches(prev, patches);
12141
+ contextRef.current = merged;
12142
+ return merged;
12143
+ });
12144
+ });
12145
+ var setScrollContext = useMemoizedFn(function (recipe) {
12146
+ setContext(function (ctx_) {
12147
+ var result = produce(ctx_, recipe);
12148
+ if (result === ctx_) {
12149
+ return ctx_;
12150
+ }
12151
+ contextRef.current = result;
12120
12152
  return result;
12121
12153
  });
12122
- }, [emitOp]);
12154
+ });
12123
12155
  var handleUndo = useCallback(function () {
12124
12156
  var history = globalCache.current.undoList.pop();
12125
12157
  if (history) {
@@ -12192,12 +12224,13 @@ var Workbook = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
12192
12224
  return {
12193
12225
  context: context,
12194
12226
  setContext: setContextWithProduce,
12227
+ setScrollContext: setScrollContext,
12195
12228
  settings: mergedSettings,
12196
12229
  handleUndo: handleUndo,
12197
12230
  handleRedo: handleRedo,
12198
12231
  refs: refs
12199
12232
  };
12200
- }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce]);
12233
+ }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce, setScrollContext]);
12201
12234
  useEffect(function () {
12202
12235
  if (!_.isEmpty(context.luckysheetfile)) {
12203
12236
  onChange === null || onChange === void 0 ? void 0 : onChange(context.luckysheetfile);
package/dist/index.js CHANGED
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var core = require('@leankylin-sheet/core');
6
+ var ahooks = require('ahooks');
6
7
  var React = require('react');
7
8
  var produce = require('immer');
8
9
  var _ = require('lodash');
9
- var ahooks = require('ahooks');
10
10
  var reactDom = require('react-dom');
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -566,6 +566,7 @@ var defaultRefs = {
566
566
  var WorkbookContext = /*#__PURE__*/React__default['default'].createContext({
567
567
  context: core.defaultContext(defaultRefs),
568
568
  setContext: function setContext() {},
569
+ setScrollContext: function setScrollContext() {},
569
570
  settings: core.defaultSettings,
570
571
  handleUndo: function handleUndo() {},
571
572
  handleRedo: function handleRedo() {},
@@ -1680,7 +1681,7 @@ var ScrollBar = function ScrollBar(_ref) {
1680
1681
  var _useContext = React.useContext(WorkbookContext),
1681
1682
  context = _useContext.context,
1682
1683
  refs = _useContext.refs,
1683
- setContext = _useContext.setContext;
1684
+ setScrollContext = _useContext.setScrollContext;
1684
1685
  var ref = axis === "x" ? refs.scrollbarX : refs.scrollbarY;
1685
1686
  var _useInViewport = ahooks.useInViewport(ref),
1686
1687
  _useInViewport2 = _slicedToArray(_useInViewport, 1),
@@ -1713,11 +1714,11 @@ var ScrollBar = function ScrollBar(_ref) {
1713
1714
  className: "luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-".concat(axis),
1714
1715
  onScroll: function onScroll() {
1715
1716
  if (axis === "x") {
1716
- setContext(function (draftCtx) {
1717
+ setScrollContext(function (draftCtx) {
1717
1718
  draftCtx.scrollLeft = refs.scrollbarX.current.scrollLeft;
1718
1719
  });
1719
1720
  } else {
1720
- setContext(function (draftCtx) {
1721
+ setScrollContext(function (draftCtx) {
1721
1722
  draftCtx.scrollTop = refs.scrollbarY.current.scrollTop;
1722
1723
  });
1723
1724
  }
@@ -4360,9 +4361,7 @@ var SheetOverlay = function SheetOverlay() {
4360
4361
  }, [setContext, refs.globalCache, refs.cellInput, refs.cellArea, refs.fxInput, refs.canvas]);
4361
4362
  var debounceMouseMove = ahooks.useMemoizedFn(function (e) {
4362
4363
  var nativeEvent = e.nativeEvent;
4363
- setContext(function (draftCtx) {
4364
- core.handleCellAreaMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellArea.current);
4365
- });
4364
+ core.handleCellAreaMouseMove(context, refs.globalCache, nativeEvent, refs.cellArea.current);
4366
4365
  });
4367
4366
  var debounceDragOver = ahooks.useMemoizedFn(function (e) {
4368
4367
  var nativeEvent = e.nativeEvent;
@@ -4432,12 +4431,29 @@ var SheetOverlay = function SheetOverlay() {
4432
4431
  debouncedShowLinkCard(globalCache, rc.r, rc.c, false, true);
4433
4432
  }
4434
4433
  }, [debouncedShowLinkCard]);
4434
+ var lastHoverCellRef = React.useRef(null);
4435
4435
  var onMouseMove = React.useCallback(function (nativeEvent) {
4436
+ var _gc$commentBox, _gc$commentBox2, _gc$searchDialog, _gc$linkCard;
4437
+ var container = containerRef.current;
4438
+ var scrollX = refs.scrollbarX.current;
4439
+ var scrollY = refs.scrollbarY.current;
4440
+ if (!container || !scrollX || !scrollY) return;
4441
+ var gc = refs.globalCache;
4442
+ var isInteracting = !!context.luckysheet_scroll_status || !!context.luckysheet_select_status || !!context.luckysheet_rows_selected_status || !!context.luckysheet_cols_selected_status || !!context.luckysheet_cell_selected_move || !!context.luckysheet_cell_selected_extend || !!context.luckysheet_cols_change_size || !!context.luckysheet_rows_change_size || ((_gc$commentBox = gc.commentBox) === null || _gc$commentBox === void 0 ? void 0 : _gc$commentBox.movingId) != null || ((_gc$commentBox2 = gc.commentBox) === null || _gc$commentBox2 === void 0 ? void 0 : _gc$commentBox2.resizingId) != null || gc.image != null || ((_gc$searchDialog = gc.searchDialog) === null || _gc$searchDialog === void 0 ? void 0 : _gc$searchDialog.moveProps) != null || ((_gc$linkCard = gc.linkCard) === null || _gc$linkCard === void 0 ? void 0 : _gc$linkCard.rangeSelectionModal) != null;
4443
+ if (!isInteracting) {
4444
+ var rc = core.getCellRowColumn(context, nativeEvent, container, scrollX, scrollY);
4445
+ var last = lastHoverCellRef.current;
4446
+ var hoverChanged = rc == null ? last != null : last == null || last.r !== rc.r || last.c !== rc.c;
4447
+ if (!hoverChanged) {
4448
+ return;
4449
+ }
4450
+ lastHoverCellRef.current = rc !== null && rc !== void 0 ? rc : null;
4451
+ }
4436
4452
  setContext(function (draftCtx) {
4437
- overShowLinkCard(draftCtx, refs.globalCache, nativeEvent, containerRef.current, refs.scrollbarX.current, refs.scrollbarY.current);
4438
- core.handleOverlayMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellInput.current, refs.scrollbarX.current, refs.scrollbarY.current, containerRef.current, refs.fxInput.current);
4453
+ overShowLinkCard(draftCtx, refs.globalCache, nativeEvent, container, scrollX, scrollY);
4454
+ core.handleOverlayMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellInput.current, scrollX, scrollY, container, refs.fxInput.current);
4439
4455
  });
4440
- }, [overShowLinkCard, refs.cellInput, refs.fxInput, refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
4456
+ }, [overShowLinkCard, context, refs.cellInput, refs.fxInput, refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
4441
4457
  var onMouseUp = React.useCallback(function (nativeEvent) {
4442
4458
  setContext(function (draftCtx) {
4443
4459
  try {
@@ -5024,9 +5040,7 @@ var Sheet = function Sheet(_ref) {
5024
5040
  return false;
5025
5041
  }
5026
5042
  var onWheel = React.useCallback(function (e) {
5027
- setContext(function (draftCtx) {
5028
- core.handleGlobalWheel(draftCtx, e, refs.globalCache, refs.scrollbarX.current, refs.scrollbarY.current);
5029
- });
5043
+ core.handleGlobalWheel(context, e, refs.globalCache, refs.scrollbarX.current, refs.scrollbarY.current);
5030
5044
  if (e.deltaY === 0 && e.deltaX === 0) {
5031
5045
  return;
5032
5046
  }
@@ -5047,7 +5061,7 @@ var Sheet = function Sheet(_ref) {
5047
5061
  e.preventDefault();
5048
5062
  }
5049
5063
  }
5050
- }, [refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
5064
+ }, [context, refs.globalCache, refs.scrollbarX, refs.scrollbarY]);
5051
5065
  React.useEffect(function () {
5052
5066
  var container = containerRef.current;
5053
5067
  container === null || container === void 0 ? void 0 : container.addEventListener("wheel", onWheel);
@@ -11968,6 +11982,7 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
11968
11982
  _useState2 = _slicedToArray(_useState, 2),
11969
11983
  context = _useState2[0],
11970
11984
  setContext = _useState2[1];
11985
+ var contextRef = React.useRef(context);
11971
11986
  var _useState3 = React.useState(null),
11972
11987
  _useState4 = _slicedToArray(_useState3, 2),
11973
11988
  moreToolbarItems = _useState4[0],
@@ -12072,64 +12087,81 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
12072
12087
  }
12073
12088
  return cellData;
12074
12089
  }
12075
- var setContextWithProduce = React.useCallback(function (recipe) {
12090
+ var setContextWithProduce = ahooks.useMemoizedFn(function (recipe) {
12076
12091
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12077
- setContext(function (ctx_) {
12078
- var _produceWithPatches = produce.produceWithPatches(ctx_, concatProducer(recipe, triggerGroupValuesRefresh)),
12079
- _produceWithPatches2 = _slicedToArray(_produceWithPatches, 3),
12080
- result = _produceWithPatches2[0],
12081
- patches = _produceWithPatches2[1],
12082
- inversePatches = _produceWithPatches2[2];
12083
- if (patches.length > 0 && !options.noHistory) {
12084
- if (options.logPatch) {
12085
- console.info("patch", patches);
12086
- }
12087
- var filteredPatches = core.filterPatch(patches);
12088
- var filteredInversePatches = core.filterPatch(inversePatches);
12089
- if (filteredInversePatches.length > 0) {
12090
- options.id = ctx_.currentSheetId;
12091
- if (options.deleteSheetOp) {
12092
- var target = ctx_.luckysheetfile.filter(function (sheet) {
12093
- var _options$deleteSheetO;
12094
- return sheet.id === ((_options$deleteSheetO = options.deleteSheetOp) === null || _options$deleteSheetO === void 0 ? void 0 : _options$deleteSheetO.id);
12095
- });
12096
- if (target) {
12097
- var index = core.getSheetIndex(ctx_, options.deleteSheetOp.id);
12098
- options.deletedSheet = {
12099
- id: options.deleteSheetOp.id,
12100
- index: index,
12101
- value: ___default['default'].cloneDeep(ctx_.luckysheetfile[index])
12102
- };
12103
- options.deletedSheet.value.celldata = dataToCelldata(options.deletedSheet.value.data);
12104
- delete options.deletedSheet.value.data;
12105
- options.deletedSheet.value.status = 0;
12106
- filteredInversePatches = [{
12107
- op: "add",
12108
- path: ["luckysheetfile", 0],
12109
- value: options.deletedSheet.value
12110
- }];
12111
- }
12112
- } else if (options.addSheetOp) {
12113
- options.addSheet = {};
12114
- options.addSheet.id = result.luckysheetfile[result.luckysheetfile.length - 1].id;
12115
- }
12116
- globalCache.current.undoList.push({
12117
- patches: filteredPatches,
12118
- inversePatches: filteredInversePatches,
12119
- options: options
12092
+ var ctx_ = contextRef.current;
12093
+ var _produceWithPatches = produce.produceWithPatches(ctx_, concatProducer(recipe, triggerGroupValuesRefresh)),
12094
+ _produceWithPatches2 = _slicedToArray(_produceWithPatches, 3),
12095
+ result = _produceWithPatches2[0],
12096
+ patches = _produceWithPatches2[1],
12097
+ inversePatches = _produceWithPatches2[2];
12098
+ if (patches.length > 0 && !options.noHistory) {
12099
+ if (options.logPatch) {
12100
+ console.info("patch", patches);
12101
+ }
12102
+ var filteredPatches = core.filterPatch(patches);
12103
+ var filteredInversePatches = core.filterPatch(inversePatches);
12104
+ if (filteredInversePatches.length > 0) {
12105
+ options.id = ctx_.currentSheetId;
12106
+ if (options.deleteSheetOp) {
12107
+ var target = ctx_.luckysheetfile.filter(function (sheet) {
12108
+ var _options$deleteSheetO;
12109
+ return sheet.id === ((_options$deleteSheetO = options.deleteSheetOp) === null || _options$deleteSheetO === void 0 ? void 0 : _options$deleteSheetO.id);
12120
12110
  });
12121
- globalCache.current.redoList = [];
12122
- emitOp(result, filteredPatches, options);
12123
- }
12124
- } else {
12125
- var _patches$, _patches$$value, _ctx_$luckysheetfile;
12126
- if ((patches === null || patches === void 0 ? void 0 : (_patches$ = patches[0]) === null || _patches$ === void 0 ? void 0 : (_patches$$value = _patches$.value) === null || _patches$$value === void 0 ? void 0 : _patches$$value.length) < (ctx_ === null || ctx_ === void 0 ? void 0 : (_ctx_$luckysheetfile = ctx_.luckysheetfile) === null || _ctx_$luckysheetfile === void 0 ? void 0 : _ctx_$luckysheetfile.length)) {
12127
- reduceUndoList(result, ctx_);
12111
+ if (target) {
12112
+ var index = core.getSheetIndex(ctx_, options.deleteSheetOp.id);
12113
+ options.deletedSheet = {
12114
+ id: options.deleteSheetOp.id,
12115
+ index: index,
12116
+ value: ___default['default'].cloneDeep(ctx_.luckysheetfile[index])
12117
+ };
12118
+ options.deletedSheet.value.celldata = dataToCelldata(options.deletedSheet.value.data);
12119
+ delete options.deletedSheet.value.data;
12120
+ options.deletedSheet.value.status = 0;
12121
+ filteredInversePatches = [{
12122
+ op: "add",
12123
+ path: ["luckysheetfile", 0],
12124
+ value: options.deletedSheet.value
12125
+ }];
12126
+ }
12127
+ } else if (options.addSheetOp) {
12128
+ options.addSheet = {};
12129
+ options.addSheet.id = result.luckysheetfile[result.luckysheetfile.length - 1].id;
12128
12130
  }
12131
+ globalCache.current.undoList.push({
12132
+ patches: filteredPatches,
12133
+ inversePatches: filteredInversePatches,
12134
+ options: options
12135
+ });
12136
+ globalCache.current.redoList = [];
12137
+ emitOp(result, filteredPatches, options);
12138
+ }
12139
+ } else {
12140
+ var _patches$, _patches$$value, _ctx_$luckysheetfile;
12141
+ if ((patches === null || patches === void 0 ? void 0 : (_patches$ = patches[0]) === null || _patches$ === void 0 ? void 0 : (_patches$$value = _patches$.value) === null || _patches$$value === void 0 ? void 0 : _patches$$value.length) < (ctx_ === null || ctx_ === void 0 ? void 0 : (_ctx_$luckysheetfile = ctx_.luckysheetfile) === null || _ctx_$luckysheetfile === void 0 ? void 0 : _ctx_$luckysheetfile.length)) {
12142
+ reduceUndoList(result, ctx_);
12143
+ }
12144
+ }
12145
+ contextRef.current = result;
12146
+ setContext(function (prev) {
12147
+ if (prev === ctx_) {
12148
+ return result;
12129
12149
  }
12150
+ var merged = produce.applyPatches(prev, patches);
12151
+ contextRef.current = merged;
12152
+ return merged;
12153
+ });
12154
+ });
12155
+ var setScrollContext = ahooks.useMemoizedFn(function (recipe) {
12156
+ setContext(function (ctx_) {
12157
+ var result = produce__default['default'](ctx_, recipe);
12158
+ if (result === ctx_) {
12159
+ return ctx_;
12160
+ }
12161
+ contextRef.current = result;
12130
12162
  return result;
12131
12163
  });
12132
- }, [emitOp]);
12164
+ });
12133
12165
  var handleUndo = React.useCallback(function () {
12134
12166
  var history = globalCache.current.undoList.pop();
12135
12167
  if (history) {
@@ -12202,12 +12234,13 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
12202
12234
  return {
12203
12235
  context: context,
12204
12236
  setContext: setContextWithProduce,
12237
+ setScrollContext: setScrollContext,
12205
12238
  settings: mergedSettings,
12206
12239
  handleUndo: handleUndo,
12207
12240
  handleRedo: handleRedo,
12208
12241
  refs: refs
12209
12242
  };
12210
- }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce]);
12243
+ }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce, setScrollContext]);
12211
12244
  React.useEffect(function () {
12212
12245
  if (!___default['default'].isEmpty(context.luckysheetfile)) {
12213
12246
  onChange === null || onChange === void 0 ? void 0 : onChange(context.luckysheetfile);