@leankylin-sheet/react 5.2.77 → 6.0.1

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.
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
  }
@@ -2272,7 +2273,7 @@ var LinkEditCard = function LinkEditCard(_ref) {
2272
2273
  c = _ref.c,
2273
2274
  rc = _ref.rc,
2274
2275
  originText = _ref.originText,
2275
- originType = _ref.originType,
2276
+ _originType = _ref.originType,
2276
2277
  originAddress = _ref.originAddress,
2277
2278
  isEditing = _ref.isEditing,
2278
2279
  position = _ref.position,
@@ -2280,7 +2281,8 @@ var LinkEditCard = function LinkEditCard(_ref) {
2280
2281
  var _useContext = React.useContext(WorkbookContext),
2281
2282
  context = _useContext.context,
2282
2283
  setContext = _useContext.setContext,
2283
- refs = _useContext.refs;
2284
+ refs = _useContext.refs,
2285
+ settings = _useContext.settings;
2284
2286
  var _useState = React.useState(originText),
2285
2287
  _useState2 = _slicedToArray(_useState, 2),
2286
2288
  linkText = _useState2[0],
@@ -2289,10 +2291,19 @@ var LinkEditCard = function LinkEditCard(_ref) {
2289
2291
  _useState4 = _slicedToArray(_useState3, 2),
2290
2292
  linkAddress = _useState4[0],
2291
2293
  setLinkAddress = _useState4[1];
2294
+ var originType = _originType || settings.detailLinkType || "webpage";
2292
2295
  var _useState5 = React.useState(originType),
2293
2296
  _useState6 = _slicedToArray(_useState5, 2),
2294
2297
  linkType = _useState6[0],
2295
2298
  setLinkType = _useState6[1];
2299
+ var _useState7 = React.useState(function () {
2300
+ var _origin$payload;
2301
+ var origin = core.getCellHyperlink(context, r, c);
2302
+ return (_origin$payload = origin === null || origin === void 0 ? void 0 : origin.payload) !== null && _origin$payload !== void 0 ? _origin$payload : {};
2303
+ }),
2304
+ _useState8 = _slicedToArray(_useState7, 2),
2305
+ customPayload = _useState8[0],
2306
+ setCustomPayload = _useState8[1];
2296
2307
  var _locale = core.locale(context),
2297
2308
  insertLink = _locale.insertLink,
2298
2309
  linkTypeList = _locale.linkTypeList,
@@ -2303,9 +2314,65 @@ var LinkEditCard = function LinkEditCard(_ref) {
2303
2314
  }]));
2304
2315
  var skipCellRangeSet = React.useRef(true);
2305
2316
  var isLinkAddressValid = core.isLinkValid(context, linkType, linkAddress);
2306
- var tooltip = /*#__PURE__*/React__default['default'].createElement("div", {
2307
- className: "validation-input-tip"
2308
- }, isLinkAddressValid.tooltip);
2317
+ var mergedLinkTypeList = React.useMemo(function () {
2318
+ var _settings$customLinkT;
2319
+ var customs = (_settings$customLinkT = settings === null || settings === void 0 ? void 0 : settings.customLinkTypes) !== null && _settings$customLinkT !== void 0 ? _settings$customLinkT : [];
2320
+ if (customs.length === 0) return linkTypeList;
2321
+ var builtinTypes = new Set(linkTypeList.map(function (it) {
2322
+ return it.value;
2323
+ }));
2324
+ var extra = customs.filter(function (it) {
2325
+ return it.type && !builtinTypes.has(it.type);
2326
+ }).map(function (it) {
2327
+ return {
2328
+ text: it.text,
2329
+ value: it.type
2330
+ };
2331
+ });
2332
+ return [].concat(_toConsumableArray(extra), _toConsumableArray(linkTypeList));
2333
+ }, [settings === null || settings === void 0 ? void 0 : settings.customLinkTypes, linkTypeList]);
2334
+ var customLinkTypeMap = React.useMemo(function () {
2335
+ var _settings$customLinkT2;
2336
+ var m = {};
2337
+ ((_settings$customLinkT2 = settings === null || settings === void 0 ? void 0 : settings.customLinkTypes) !== null && _settings$customLinkT2 !== void 0 ? _settings$customLinkT2 : []).forEach(function (it) {
2338
+ if (it.type) m[it.type] = it;
2339
+ });
2340
+ return m;
2341
+ }, [settings === null || settings === void 0 ? void 0 : settings.customLinkTypes]);
2342
+ var currentCustomConfig = customLinkTypeMap[linkType];
2343
+ var isCustomTypeValid = React.useMemo(function () {
2344
+ if (!currentCustomConfig) return true;
2345
+ if (!currentCustomConfig.onSave) return true;
2346
+ var next = currentCustomConfig.onSave({
2347
+ linkText: linkText,
2348
+ linkAddress: linkAddress,
2349
+ position: {
2350
+ r: r,
2351
+ c: c
2352
+ },
2353
+ origin: function () {
2354
+ var o = core.getCellHyperlink(context, r, c);
2355
+ return o ? {
2356
+ linkType: o.linkType,
2357
+ linkAddress: o.linkAddress,
2358
+ payload: o.payload
2359
+ } : undefined;
2360
+ }()
2361
+ });
2362
+ return next !== undefined;
2363
+ }, [currentCustomConfig, linkText, linkAddress, r, c, context]);
2364
+ var canSubmit = !currentCustomConfig || isCustomTypeValid ? isLinkAddressValid.isValid : false;
2365
+ var tooltip = function () {
2366
+ var text;
2367
+ if (currentCustomConfig) {
2368
+ text = isCustomTypeValid ? "" : insertLink.tooltipInfo1 || "";
2369
+ } else {
2370
+ text = isLinkAddressValid.tooltip;
2371
+ }
2372
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2373
+ className: "validation-input-tip"
2374
+ }, text);
2375
+ }();
2309
2376
  var hideLinkCard = React.useCallback(function () {
2310
2377
  ___default['default'].set(refs.globalCache, "linkCard.mouseEnter", false);
2311
2378
  setContext(function (draftCtx) {
@@ -2367,10 +2434,13 @@ var LinkEditCard = function LinkEditCard(_ref) {
2367
2434
  }));
2368
2435
  }, []);
2369
2436
  React.useLayoutEffect(function () {
2437
+ var _origin$payload2;
2370
2438
  setLinkAddress(originAddress);
2371
2439
  setLinkText(originText);
2372
2440
  setLinkType(originType);
2373
- }, [rc, originAddress, originText, originType]);
2441
+ var origin = core.getCellHyperlink(context, r, c);
2442
+ setCustomPayload((_origin$payload2 = origin === null || origin === void 0 ? void 0 : origin.payload) !== null && _origin$payload2 !== void 0 ? _origin$payload2 : {});
2443
+ }, [rc, originAddress, originText, originType, r, c, context]);
2374
2444
  React.useLayoutEffect(function () {
2375
2445
  if (selectingCellRange) {
2376
2446
  skipCellRangeSet.current = true;
@@ -2389,6 +2459,7 @@ var LinkEditCard = function LinkEditCard(_ref) {
2389
2459
  }
2390
2460
  }, [context, selectingCellRange]);
2391
2461
  if (!isEditing) {
2462
+ var toolbarCustomConfig = customLinkTypeMap[originType];
2392
2463
  return /*#__PURE__*/React__default['default'].createElement("div", _objectSpread2(_objectSpread2({}, containerEvent), {}, {
2393
2464
  onKeyDown: function onKeyDown(e) {
2394
2465
  e.stopPropagation();
@@ -2400,16 +2471,35 @@ var LinkEditCard = function LinkEditCard(_ref) {
2400
2471
  }
2401
2472
  }), /*#__PURE__*/React__default['default'].createElement("div", {
2402
2473
  className: "link-content",
2403
- onClick: function onClick() {
2474
+ onClick: function onClick(reactEvent) {
2475
+ var _getCellHyperlink, _toolbarCustomConfig$, _settings$hooks, _settings$hooks$onHyp;
2476
+ var payload = (_getCellHyperlink = core.getCellHyperlink(context, r, c)) === null || _getCellHyperlink === void 0 ? void 0 : _getCellHyperlink.payload;
2477
+ var clickInfo = {
2478
+ linkType: originType,
2479
+ linkAddress: originAddress,
2480
+ payload: payload,
2481
+ position: {
2482
+ r: r,
2483
+ c: c,
2484
+ sheetId: context.currentSheetId
2485
+ },
2486
+ event: reactEvent
2487
+ };
2488
+ var userResult = toolbarCustomConfig === null || toolbarCustomConfig === void 0 ? void 0 : (_toolbarCustomConfig$ = toolbarCustomConfig.onClick) === null || _toolbarCustomConfig$ === void 0 ? void 0 : _toolbarCustomConfig$.call(toolbarCustomConfig, clickInfo);
2489
+ settings === null || settings === void 0 ? void 0 : (_settings$hooks = settings.hooks) === null || _settings$hooks === void 0 ? void 0 : (_settings$hooks$onHyp = _settings$hooks.onHyperlinkClick) === null || _settings$hooks$onHyp === void 0 ? void 0 : _settings$hooks$onHyp.call(_settings$hooks, clickInfo);
2490
+ if (userResult === false) {
2491
+ hideLinkCard();
2492
+ return;
2493
+ }
2404
2494
  setContext(function (draftCtx) {
2405
- return core.goToLink(draftCtx, r, c, linkType, linkAddress, refs.scrollbarX.current, refs.scrollbarY.current);
2495
+ return core.goToLink(draftCtx, r, c, originType, originAddress, refs.scrollbarX.current, refs.scrollbarY.current);
2406
2496
  });
2407
2497
  }
2408
- }, linkType === "webpage" ? insertLink.openLink : core.replaceHtml(insertLink.goTo, {
2409
- linkAddress: linkAddress
2498
+ }, originType === "webpage" ? insertLink.openLink : core.replaceHtml(insertLink.goTo, {
2499
+ linkAddress: originAddress
2410
2500
  })), context.allowEdit === true && /*#__PURE__*/React__default['default'].createElement("div", {
2411
2501
  className: "divider"
2412
- }), context.allowEdit === true && linkType === "webpage" && renderToolbarButton("copy", function () {
2502
+ }), context.allowEdit === true && originType === "webpage" && renderToolbarButton("copy", function () {
2413
2503
  navigator.clipboard.writeText(originAddress);
2414
2504
  hideLinkCard();
2415
2505
  }), context.allowEdit === true && renderToolbarButton("pencil", function () {
@@ -2488,18 +2578,23 @@ var LinkEditCard = function LinkEditCard(_ref) {
2488
2578
  className: "leankylin-link-modify-select",
2489
2579
  value: linkType,
2490
2580
  onChange: function onChange(e) {
2491
- if (e.target.value === "sheet") {
2581
+ var next = e.target.value;
2582
+ var nextCustomConfig = customLinkTypeMap[next];
2583
+ if (next === "sheet") {
2492
2584
  if (!linkText) {
2493
2585
  setLinkText(context.luckysheetfile[0].name);
2494
2586
  }
2495
2587
  setLinkAddress(context.luckysheetfile[0].name);
2588
+ } else if (nextCustomConfig) {
2589
+ setLinkAddress("");
2590
+ setCustomPayload({});
2496
2591
  } else {
2497
2592
  setLinkAddress("");
2498
2593
  }
2499
- if (e.target.value === "cellrange") setRangeModalVisible(true);
2500
- setLinkType(e.target.value);
2594
+ if (next === "cellrange") setRangeModalVisible(true);
2595
+ setLinkType(next);
2501
2596
  }
2502
- }, linkTypeList.map(function (type) {
2597
+ }, mergedLinkTypeList.map(function (type) {
2503
2598
  return /*#__PURE__*/React__default['default'].createElement("option", {
2504
2599
  key: type.value,
2505
2600
  value: type.value
@@ -2545,11 +2640,63 @@ var LinkEditCard = function LinkEditCard(_ref) {
2545
2640
  key: sheet.id,
2546
2641
  value: sheet.name
2547
2642
  }, sheet.name);
2643
+ })), tooltip)), currentCustomConfig && ( /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, currentCustomConfig.render ? currentCustomConfig.render({
2644
+ value: linkAddress,
2645
+ position: {
2646
+ r: r,
2647
+ c: c
2648
+ },
2649
+ onChange: function onChange(v) {
2650
+ return setLinkAddress(v);
2651
+ },
2652
+ setPayload: function setPayload(next) {
2653
+ setCustomPayload(function (prev) {
2654
+ return typeof next === "function" ? next(prev) : next;
2655
+ });
2656
+ },
2657
+ payload: customPayload,
2658
+ ctx: {
2659
+ context: context,
2660
+ setContext: setContext,
2661
+ settings: settings
2662
+ }
2663
+ }) : ( /*#__PURE__*/React__default['default'].createElement("input", {
2664
+ className: "leankylin-link-modify-input ".concat(canSubmit ? "" : "error-input"),
2665
+ spellCheck: "false",
2666
+ value: linkAddress,
2667
+ onChange: function onChange(e) {
2668
+ return setLinkAddress(e.target.value);
2669
+ }
2548
2670
  })), tooltip))), /*#__PURE__*/React__default['default'].createElement("div", {
2549
2671
  className: "modal-footer"
2550
2672
  }, renderBottomButton(function () {
2551
- if (!isLinkAddressValid.isValid) return;
2673
+ if (!canSubmit) return;
2552
2674
  ___default['default'].set(refs.globalCache, "linkCard.mouseEnter", false);
2675
+ if (currentCustomConfig === null || currentCustomConfig === void 0 ? void 0 : currentCustomConfig.onSave) {
2676
+ var origin = function () {
2677
+ var o = core.getCellHyperlink(context, r, c);
2678
+ return o ? {
2679
+ linkType: o.linkType,
2680
+ linkAddress: o.linkAddress,
2681
+ payload: o.payload
2682
+ } : undefined;
2683
+ }();
2684
+ var saved = currentCustomConfig.onSave({
2685
+ linkText: linkText,
2686
+ linkAddress: linkAddress,
2687
+ position: {
2688
+ r: r,
2689
+ c: c
2690
+ },
2691
+ origin: origin
2692
+ });
2693
+ if (!saved) return;
2694
+ setContext(function (draftCtx) {
2695
+ var _saved$payload;
2696
+ return core.saveHyperlink(draftCtx, r, c, linkText || saved.linkAddress, saved.linkType, saved.linkAddress, _objectSpread2(_objectSpread2({}, customPayload), (_saved$payload = saved.payload) !== null && _saved$payload !== void 0 ? _saved$payload : {}));
2697
+ });
2698
+ return;
2699
+ }
2553
2700
  setContext(function (draftCtx) {
2554
2701
  return core.saveHyperlink(draftCtx, r, c, linkText, linkType, linkAddress);
2555
2702
  });
@@ -4360,9 +4507,7 @@ var SheetOverlay = function SheetOverlay() {
4360
4507
  }, [setContext, refs.globalCache, refs.cellInput, refs.cellArea, refs.fxInput, refs.canvas]);
4361
4508
  var debounceMouseMove = ahooks.useMemoizedFn(function (e) {
4362
4509
  var nativeEvent = e.nativeEvent;
4363
- setContext(function (draftCtx) {
4364
- core.handleCellAreaMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellArea.current);
4365
- });
4510
+ core.handleCellAreaMouseMove(context, refs.globalCache, nativeEvent, refs.cellArea.current);
4366
4511
  });
4367
4512
  var debounceDragOver = ahooks.useMemoizedFn(function (e) {
4368
4513
  var nativeEvent = e.nativeEvent;
@@ -4428,16 +4573,53 @@ var SheetOverlay = function SheetOverlay() {
4428
4573
  if (link == null) {
4429
4574
  debouncedShowLinkCard(globalCache, rc.r, rc.c, false);
4430
4575
  } else {
4576
+ var _settings$customLinkT, _customConfig$onHover, _settings$hooks, _settings$hooks$onHyp;
4431
4577
  core.showLinkCard(ctx, rc.r, rc.c, false);
4432
4578
  debouncedShowLinkCard(globalCache, rc.r, rc.c, false, true);
4579
+ var payload = link.payload;
4580
+ var customConfigMap = ((_settings$customLinkT = settings === null || settings === void 0 ? void 0 : settings.customLinkTypes) !== null && _settings$customLinkT !== void 0 ? _settings$customLinkT : []).reduce(function (acc, it) {
4581
+ if (it.type) acc[it.type] = it;
4582
+ return acc;
4583
+ }, {});
4584
+ var customConfig = customConfigMap[link.linkType];
4585
+ var hoverInfo = {
4586
+ linkType: link.linkType,
4587
+ linkAddress: link.linkAddress,
4588
+ payload: payload,
4589
+ position: {
4590
+ r: rc.r,
4591
+ c: rc.c,
4592
+ sheetId: ctx.currentSheetId
4593
+ },
4594
+ event: e
4595
+ };
4596
+ customConfig === null || customConfig === void 0 ? void 0 : (_customConfig$onHover = customConfig.onHover) === null || _customConfig$onHover === void 0 ? void 0 : _customConfig$onHover.call(customConfig, hoverInfo);
4597
+ settings === null || settings === void 0 ? void 0 : (_settings$hooks = settings.hooks) === null || _settings$hooks === void 0 ? void 0 : (_settings$hooks$onHyp = _settings$hooks.onHyperlinkHover) === null || _settings$hooks$onHyp === void 0 ? void 0 : _settings$hooks$onHyp.call(_settings$hooks, hoverInfo);
4433
4598
  }
4434
- }, [debouncedShowLinkCard]);
4599
+ }, [debouncedShowLinkCard, settings]);
4600
+ var lastHoverCellRef = React.useRef(null);
4435
4601
  var onMouseMove = React.useCallback(function (nativeEvent) {
4602
+ var _gc$commentBox, _gc$commentBox2, _gc$searchDialog, _gc$linkCard;
4603
+ var container = containerRef.current;
4604
+ var scrollX = refs.scrollbarX.current;
4605
+ var scrollY = refs.scrollbarY.current;
4606
+ if (!container || !scrollX || !scrollY) return;
4607
+ var gc = refs.globalCache;
4608
+ 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;
4609
+ if (!isInteracting) {
4610
+ var rc = core.getCellRowColumn(context, nativeEvent, container, scrollX, scrollY);
4611
+ var last = lastHoverCellRef.current;
4612
+ var hoverChanged = rc == null ? last != null : last == null || last.r !== rc.r || last.c !== rc.c;
4613
+ if (!hoverChanged) {
4614
+ return;
4615
+ }
4616
+ lastHoverCellRef.current = rc !== null && rc !== void 0 ? rc : null;
4617
+ }
4436
4618
  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);
4619
+ overShowLinkCard(draftCtx, refs.globalCache, nativeEvent, container, scrollX, scrollY);
4620
+ core.handleOverlayMouseMove(draftCtx, refs.globalCache, nativeEvent, refs.cellInput.current, scrollX, scrollY, container, refs.fxInput.current);
4439
4621
  });
4440
- }, [overShowLinkCard, refs.cellInput, refs.fxInput, refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
4622
+ }, [overShowLinkCard, context, refs.cellInput, refs.fxInput, refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
4441
4623
  var onMouseUp = React.useCallback(function (nativeEvent) {
4442
4624
  setContext(function (draftCtx) {
4443
4625
  try {
@@ -5024,9 +5206,7 @@ var Sheet = function Sheet(_ref) {
5024
5206
  return false;
5025
5207
  }
5026
5208
  var onWheel = React.useCallback(function (e) {
5027
- setContext(function (draftCtx) {
5028
- core.handleGlobalWheel(draftCtx, e, refs.globalCache, refs.scrollbarX.current, refs.scrollbarY.current);
5029
- });
5209
+ core.handleGlobalWheel(context, e, refs.globalCache, refs.scrollbarX.current, refs.scrollbarY.current);
5030
5210
  if (e.deltaY === 0 && e.deltaX === 0) {
5031
5211
  return;
5032
5212
  }
@@ -5047,7 +5227,7 @@ var Sheet = function Sheet(_ref) {
5047
5227
  e.preventDefault();
5048
5228
  }
5049
5229
  }
5050
- }, [refs.globalCache, refs.scrollbarX, refs.scrollbarY, setContext]);
5230
+ }, [context, refs.globalCache, refs.scrollbarX, refs.scrollbarY]);
5051
5231
  React.useEffect(function () {
5052
5232
  var container = containerRef.current;
5053
5233
  container === null || container === void 0 ? void 0 : container.addEventListener("wheel", onWheel);
@@ -11968,6 +12148,7 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
11968
12148
  _useState2 = _slicedToArray(_useState, 2),
11969
12149
  context = _useState2[0],
11970
12150
  setContext = _useState2[1];
12151
+ var contextRef = React.useRef(context);
11971
12152
  var _useState3 = React.useState(null),
11972
12153
  _useState4 = _slicedToArray(_useState3, 2),
11973
12154
  moreToolbarItems = _useState4[0],
@@ -12072,64 +12253,81 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
12072
12253
  }
12073
12254
  return cellData;
12074
12255
  }
12075
- var setContextWithProduce = React.useCallback(function (recipe) {
12256
+ var setContextWithProduce = ahooks.useMemoizedFn(function (recipe) {
12076
12257
  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
12258
+ var ctx_ = contextRef.current;
12259
+ var _produceWithPatches = produce.produceWithPatches(ctx_, concatProducer(recipe, triggerGroupValuesRefresh)),
12260
+ _produceWithPatches2 = _slicedToArray(_produceWithPatches, 3),
12261
+ result = _produceWithPatches2[0],
12262
+ patches = _produceWithPatches2[1],
12263
+ inversePatches = _produceWithPatches2[2];
12264
+ if (patches.length > 0 && !options.noHistory) {
12265
+ if (options.logPatch) {
12266
+ console.info("patch", patches);
12267
+ }
12268
+ var filteredPatches = core.filterPatch(patches);
12269
+ var filteredInversePatches = core.filterPatch(inversePatches);
12270
+ if (filteredInversePatches.length > 0) {
12271
+ options.id = ctx_.currentSheetId;
12272
+ if (options.deleteSheetOp) {
12273
+ var target = ctx_.luckysheetfile.filter(function (sheet) {
12274
+ var _options$deleteSheetO;
12275
+ return sheet.id === ((_options$deleteSheetO = options.deleteSheetOp) === null || _options$deleteSheetO === void 0 ? void 0 : _options$deleteSheetO.id);
12120
12276
  });
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_);
12277
+ if (target) {
12278
+ var index = core.getSheetIndex(ctx_, options.deleteSheetOp.id);
12279
+ options.deletedSheet = {
12280
+ id: options.deleteSheetOp.id,
12281
+ index: index,
12282
+ value: ___default['default'].cloneDeep(ctx_.luckysheetfile[index])
12283
+ };
12284
+ options.deletedSheet.value.celldata = dataToCelldata(options.deletedSheet.value.data);
12285
+ delete options.deletedSheet.value.data;
12286
+ options.deletedSheet.value.status = 0;
12287
+ filteredInversePatches = [{
12288
+ op: "add",
12289
+ path: ["luckysheetfile", 0],
12290
+ value: options.deletedSheet.value
12291
+ }];
12292
+ }
12293
+ } else if (options.addSheetOp) {
12294
+ options.addSheet = {};
12295
+ options.addSheet.id = result.luckysheetfile[result.luckysheetfile.length - 1].id;
12128
12296
  }
12297
+ globalCache.current.undoList.push({
12298
+ patches: filteredPatches,
12299
+ inversePatches: filteredInversePatches,
12300
+ options: options
12301
+ });
12302
+ globalCache.current.redoList = [];
12303
+ emitOp(result, filteredPatches, options);
12129
12304
  }
12305
+ } else {
12306
+ var _patches$, _patches$$value, _ctx_$luckysheetfile;
12307
+ 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)) {
12308
+ reduceUndoList(result, ctx_);
12309
+ }
12310
+ }
12311
+ contextRef.current = result;
12312
+ setContext(function (prev) {
12313
+ if (prev === ctx_) {
12314
+ return result;
12315
+ }
12316
+ var merged = produce.applyPatches(prev, patches);
12317
+ contextRef.current = merged;
12318
+ return merged;
12319
+ });
12320
+ });
12321
+ var setScrollContext = ahooks.useMemoizedFn(function (recipe) {
12322
+ setContext(function (ctx_) {
12323
+ var result = produce__default['default'](ctx_, recipe);
12324
+ if (result === ctx_) {
12325
+ return ctx_;
12326
+ }
12327
+ contextRef.current = result;
12130
12328
  return result;
12131
12329
  });
12132
- }, [emitOp]);
12330
+ });
12133
12331
  var handleUndo = React.useCallback(function () {
12134
12332
  var history = globalCache.current.undoList.pop();
12135
12333
  if (history) {
@@ -12202,12 +12400,13 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
12202
12400
  return {
12203
12401
  context: context,
12204
12402
  setContext: setContextWithProduce,
12403
+ setScrollContext: setScrollContext,
12205
12404
  settings: mergedSettings,
12206
12405
  handleUndo: handleUndo,
12207
12406
  handleRedo: handleRedo,
12208
12407
  refs: refs
12209
12408
  };
12210
- }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce]);
12409
+ }, [context, handleRedo, handleUndo, mergedSettings, refs, setContextWithProduce, setScrollContext]);
12211
12410
  React.useEffect(function () {
12212
12411
  if (!___default['default'].isEmpty(context.luckysheetfile)) {
12213
12412
  onChange === null || onChange === void 0 ? void 0 : onChange(context.luckysheetfile);