@seafile/sdoc-editor 3.0.247 → 3.0.249

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.
@@ -27,12 +27,32 @@ var _helpers2 = require("./helpers");
27
27
  var _sideMenu = _interopRequireDefault(require("./side-menu"));
28
28
  require("./index.css");
29
29
  var HORIZONTAL_DROP_ZONE_WIDTH = 48;
30
- var sourceElement = null;
31
- var targetElement = null;
30
+ var getSafeNodeEntry = function getSafeNodeEntry(editor, element) {
31
+ try {
32
+ return (0, _helpers2.getNodeEntry)(editor, element);
33
+ } catch (error) {
34
+ return [];
35
+ }
36
+ };
32
37
  var SideToolbar = function SideToolbar() {
33
38
  var editor = (0, _slateReact.useSlateStatic)();
34
39
  var scrollRef = (0, _useScrollContext.useScrollContext)();
35
40
  var menuRef = (0, _react.useRef)(null);
41
+ var sideToolbarContainerRef = (0, _react.useRef)(null);
42
+ var sourceElementRef = (0, _react.useRef)(null);
43
+ var isDraggingEditorElementRef = (0, _react.useRef)(false);
44
+ var getEditorContainer = (0, _react.useCallback)(function () {
45
+ var _sideToolbarContainer;
46
+ return (_sideToolbarContainer = sideToolbarContainerRef.current) === null || _sideToolbarContainer === void 0 ? void 0 : _sideToolbarContainer.closest('.sdoc-article-container');
47
+ }, []);
48
+ var isEventInCurrentEditor = (0, _react.useCallback)(function (event) {
49
+ var editorContainer = getEditorContainer();
50
+ var eventTarget = event.target || event.currentTarget;
51
+ return Boolean(editorContainer && eventTarget && editorContainer.contains(eventTarget));
52
+ }, [getEditorContainer]);
53
+ var isEditorDrag = (0, _react.useCallback)(function () {
54
+ return isDraggingEditorElementRef.current;
55
+ }, []);
36
56
  var _useState = (0, _react.useState)(null),
37
57
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
38
58
  slateNode = _useState2[0],
@@ -67,6 +87,7 @@ var SideToolbar = function SideToolbar() {
67
87
  var showSelectedNodesRef = (0, _react.useRef)(null);
68
88
  var draggedPreviewContainer = (0, _react.useRef)(null);
69
89
  var activeDragElRef = (0, _react.useRef)(null);
90
+ var pendingSideDropRef = (0, _react.useRef)(null);
70
91
  var onReset = (0, _react.useCallback)(function () {
71
92
  setShowSideMenu(false);
72
93
  setMenuPosition({});
@@ -255,6 +276,8 @@ var SideToolbar = function SideToolbar() {
255
276
  }, [editor, isShowSideMenu, slateNode]);
256
277
  var dragStart = (0, _react.useCallback)(function (event) {
257
278
  event.stopPropagation();
279
+ sourceElementRef.current = null;
280
+ isDraggingEditorElementRef.current = true;
258
281
  // Create the preview container when dragging more than one listNodes
259
282
  var noDrag = _slate.Path.equals(editor.selection.focus.path, editor.selection.anchor.path);
260
283
  if (showSelectedNodesRef.current && showSelectedNodesRef.current.length > 1 && !noDrag) {
@@ -285,7 +308,7 @@ var SideToolbar = function SideToolbar() {
285
308
  }, 0);
286
309
  return;
287
310
  }
288
- sourceElement = _slateReact.ReactEditor.toDOMNode(editor, slateNode);
311
+ sourceElementRef.current = _slateReact.ReactEditor.toDOMNode(editor, slateNode);
289
312
  var path = _slateReact.ReactEditor.findPath(editor, slateNode);
290
313
 
291
314
  // Dragging the first element within the blockquote drags the entire blockquote by default.
@@ -293,45 +316,49 @@ var SideToolbar = function SideToolbar() {
293
316
  return p === 0;
294
317
  })) {
295
318
  var nodeEntry = _slate.Editor.node(editor, [path[0]]);
296
- sourceElement = _slateReact.ReactEditor.toDOMNode(editor, nodeEntry[0]);
319
+ sourceElementRef.current = _slateReact.ReactEditor.toDOMNode(editor, nodeEntry[0]);
297
320
  }
298
- event.dataTransfer.setDragImage(sourceElement, 0, 0);
321
+ event.dataTransfer.setDragImage(sourceElementRef.current, 0, 0);
299
322
  event.dataTransfer.setData(_event.DRAG_SDOC_EDITOR_ELEMENT, true);
300
323
  }, [editor, slateNode]);
301
324
  var dragOver = (0, _react.useCallback)(function (event) {
302
- var dragTypes = event.dataTransfer.types;
303
- if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) return;
325
+ if (!isEventInCurrentEditor(event)) return;
326
+ if (!isEditorDrag()) return;
304
327
  var overElement = event.currentTarget;
305
328
  if (!overElement.classList.contains('sdoc-dragging')) {
306
329
  overElement.classList.add('sdoc-dragging');
307
330
  }
308
- }, []);
331
+ }, [isEditorDrag, isEventInCurrentEditor]);
309
332
  var dragLeave = (0, _react.useCallback)(function (event) {
333
+ if (!isEventInCurrentEditor(event)) return;
310
334
  var leaveElement = event.currentTarget;
311
335
  leaveElement.classList.remove('sdoc-dragging');
312
- }, []);
336
+ }, [isEventInCurrentEditor]);
313
337
  var drop = (0, _react.useCallback)(function (event) {
314
- var _parentNode$children$;
315
- targetElement = event.currentTarget;
338
+ var _event$dataTransfer, _parentNode$children$;
339
+ if (!isEventInCurrentEditor(event)) return;
340
+ var targetElement = event.currentTarget;
316
341
  targetElement.classList.remove('sdoc-dragging');
317
- var dragTypes = event.dataTransfer.types;
318
- if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT) && dragTypes[0] !== 'Files') return;
342
+ var dragTypes = ((_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types) || [];
343
+ if (!isEditorDrag() && dragTypes[0] !== 'Files') return;
319
344
 
320
345
  // Prevent dragging table data to the editor
321
346
  if (dragTypes.includes(_constants2.TABLE_DRAG_KEY)) return;
322
347
 
323
348
  // Drag local image files to sdoc
324
349
  if (event.dataTransfer.files.length > 0) {
325
- var _getNodeEntry = (0, _helpers2.getNodeEntry)(editor, targetElement),
326
- _getNodeEntry2 = (0, _slicedToArray2["default"])(_getNodeEntry, 2),
327
- _targetPath = _getNodeEntry2[1];
350
+ var _getSafeNodeEntry = getSafeNodeEntry(editor, targetElement),
351
+ _getSafeNodeEntry2 = (0, _slicedToArray2["default"])(_getSafeNodeEntry, 2),
352
+ _targetPath = _getSafeNodeEntry2[1];
328
353
  (0, _helpers.insertImageFiles)(event.dataTransfer.files, editor, _targetPath);
329
354
  return;
330
355
  }
331
- var _getNodeEntry3 = (0, _helpers2.getNodeEntry)(editor, targetElement),
332
- _getNodeEntry4 = (0, _slicedToArray2["default"])(_getNodeEntry3, 2),
333
- targetNode = _getNodeEntry4[0],
334
- targetPath = _getNodeEntry4[1];
356
+ var _getSafeNodeEntry3 = getSafeNodeEntry(editor, targetElement),
357
+ _getSafeNodeEntry4 = (0, _slicedToArray2["default"])(_getSafeNodeEntry3, 2),
358
+ targetNode = _getSafeNodeEntry4[0],
359
+ targetPath = _getSafeNodeEntry4[1];
360
+ if (!targetNode || !targetPath) return;
361
+
335
362
  // Drag multiple list_items nodes
336
363
  if (draggedSourcePaths.current) {
337
364
  try {
@@ -387,10 +414,12 @@ var SideToolbar = function SideToolbar() {
387
414
  event.dataTransfer.clearData();
388
415
  }
389
416
  }
390
- var _getNodeEntry5 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
391
- _getNodeEntry6 = (0, _slicedToArray2["default"])(_getNodeEntry5, 2),
392
- sourceNode = _getNodeEntry6[0],
393
- sourcePath = _getNodeEntry6[1];
417
+ var _getSafeNodeEntry5 = getSafeNodeEntry(editor, sourceElementRef.current),
418
+ _getSafeNodeEntry6 = (0, _slicedToArray2["default"])(_getSafeNodeEntry5, 2),
419
+ sourceNode = _getSafeNodeEntry6[0],
420
+ sourcePath = _getSafeNodeEntry6[1];
421
+ if (!sourceNode || !sourcePath) return;
422
+
394
423
  // Dragging into a quoteBlock is not supported
395
424
  if ([_constants2.CODE_BLOCK, _constants2.TABLE, _constants2.BLOCKQUOTE].includes(sourceNode.type) && (0, _helpers2.isBlockquote)(editor, [targetPath[0]]) && targetPath.length > 1) {
396
425
  return;
@@ -586,9 +615,8 @@ var SideToolbar = function SideToolbar() {
586
615
  }
587
616
 
588
617
  // reset
589
- sourceElement = null;
590
- targetElement = null;
591
- }, [editor]);
618
+ sourceElementRef.current = null;
619
+ }, [editor, isEditorDrag, isEventInCurrentEditor]);
592
620
  (0, _react.useEffect)(function () {
593
621
  var eventBus = _eventBus["default"].getInstance();
594
622
  var unSubscribeDragOver = eventBus.subscribe(_constants.INTERNAL_EVENT.ON_DRAG_OVER_BLOCK, dragOver);
@@ -606,35 +634,49 @@ var SideToolbar = function SideToolbar() {
606
634
  var onMouseLeave = (0, _react.useCallback)(function () {
607
635
  setIsEnterMoreVertical(false);
608
636
  }, []);
637
+ var clearAllDragStyles = (0, _react.useCallback)(function () {
638
+ (0, _helpers2.clearDragClass)(activeDragElRef.current);
639
+ activeDragElRef.current = null;
640
+ pendingSideDropRef.current = null;
641
+ }, []);
642
+ var resetDragState = (0, _react.useCallback)(function () {
643
+ clearAllDragStyles();
644
+ sourceElementRef.current = null;
645
+ isDraggingEditorElementRef.current = false;
646
+ }, [clearAllDragStyles]);
609
647
  var handleDragover = (0, _react.useCallback)(function (event) {
610
- var _target, _target2, _target3;
648
+ var _target;
649
+ if (!isEditorDrag()) return;
611
650
  event.preventDefault();
612
- var dragTypes = event.dataTransfer.types;
613
- if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) {
614
- (0, _helpers2.clearDragClass)(activeDragElRef.current);
615
- activeDragElRef.current = null;
616
- return;
617
- }
618
- var _getNodeEntry7 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
619
- _getNodeEntry8 = (0, _slicedToArray2["default"])(_getNodeEntry7, 2),
620
- sourceNode = _getNodeEntry8[0],
621
- sourcePath = _getNodeEntry8[1];
651
+ var _getSafeNodeEntry7 = getSafeNodeEntry(editor, sourceElementRef.current),
652
+ _getSafeNodeEntry8 = (0, _slicedToArray2["default"])(_getSafeNodeEntry7, 2),
653
+ sourceNode = _getSafeNodeEntry8[0],
654
+ sourcePath = _getSafeNodeEntry8[1];
622
655
  if (!sourceNode || !sourcePath) {
623
- (0, _helpers2.clearDragClass)(activeDragElRef.current);
624
- activeDragElRef.current = null;
656
+ clearAllDragStyles();
625
657
  return;
626
658
  }
627
659
 
628
660
  // Not support node type in multi column
629
- if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(sourceNode.type)) return;
661
+ if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(sourceNode.type)) {
662
+ clearAllDragStyles();
663
+ return;
664
+ }
630
665
  // Return if source node is from multi column
631
666
  var topNode = _slate.Node.get(editor, [sourcePath[0]]);
632
- if ([_constants2.MULTI_COLUMN].includes(topNode.type)) return;
667
+ if ([_constants2.MULTI_COLUMN].includes(topNode.type)) {
668
+ clearAllDragStyles();
669
+ return;
670
+ }
633
671
 
634
672
  // Cursor position
635
673
  var x = event.clientX;
636
674
  var y = event.clientY;
637
- var editorContainer = event.currentTarget;
675
+ var editorContainer = getEditorContainer();
676
+ if (!editorContainer) {
677
+ clearAllDragStyles();
678
+ return;
679
+ }
638
680
  var containerRect = editorContainer.getBoundingClientRect();
639
681
 
640
682
  // Current visible area of editor container
@@ -664,23 +706,38 @@ var SideToolbar = function SideToolbar() {
664
706
  } finally {
665
707
  _iterator2.f();
666
708
  }
667
- if (!((_target = target) !== null && _target !== void 0 && _target.el)) return;
709
+ if (!((_target = target) !== null && _target !== void 0 && _target.el)) {
710
+ clearAllDragStyles();
711
+ return;
712
+ }
668
713
  var prevEl = activeDragElRef.current;
669
714
  if (prevEl && prevEl !== target.el) {
670
715
  (0, _helpers2.clearDragClass)(prevEl);
671
716
  }
672
- if (((_target2 = target) === null || _target2 === void 0 ? void 0 : _target2.el) === sourceElement) return;
673
- var _getNodeEntry9 = (0, _helpers2.getNodeEntry)(editor, (_target3 = target) === null || _target3 === void 0 ? void 0 : _target3.el),
674
- _getNodeEntry0 = (0, _slicedToArray2["default"])(_getNodeEntry9, 2),
675
- targetNode = _getNodeEntry0[0],
676
- targetPath = _getNodeEntry0[1];
717
+ if (target.el === sourceElementRef.current) {
718
+ clearAllDragStyles();
719
+ return;
720
+ }
721
+ var _getSafeNodeEntry9 = getSafeNodeEntry(editor, target.el),
722
+ _getSafeNodeEntry0 = (0, _slicedToArray2["default"])(_getSafeNodeEntry9, 2),
723
+ targetNode = _getSafeNodeEntry0[0],
724
+ targetPath = _getSafeNodeEntry0[1];
677
725
 
678
726
  // Not support node type in multi column
679
- if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type)) return;
680
- if (!targetNode || targetPath.length === 0 && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) return;
727
+ if (!targetNode || !targetPath || [_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type)) {
728
+ clearAllDragStyles();
729
+ return;
730
+ }
731
+ if (targetPath.length === 0 && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) {
732
+ clearAllDragStyles();
733
+ return;
734
+ }
681
735
 
682
736
  // Stop if target node is multi column node with four columns
683
- if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4) return;
737
+ if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4) {
738
+ clearAllDragStyles();
739
+ return;
740
+ }
684
741
 
685
742
  // Add hover style for target node multi column children.
686
743
  // Only use a fixed-width zone around each column boundary so the drop
@@ -688,7 +745,10 @@ var SideToolbar = function SideToolbar() {
688
745
  if (targetNode.type === _constants2.MULTI_COLUMN) {
689
746
  var multiColumnEl = target.el;
690
747
  var columnEls = Array.from(multiColumnEl.querySelectorAll('.sdoc-column-container'));
691
- if (!columnEls.length) return;
748
+ if (!columnEls.length) {
749
+ clearAllDragStyles();
750
+ return;
751
+ }
692
752
  columnEls.forEach(function (col) {
693
753
  return col.classList.remove('sdoc-dragging-left', 'sdoc-dragging', 'sdoc-dragging-right');
694
754
  });
@@ -711,8 +771,12 @@ var SideToolbar = function SideToolbar() {
711
771
  if (activeColumn) {
712
772
  activeColumn.classList.add("sdoc-dragging-".concat(activeDirection));
713
773
  activeDragElRef.current = activeColumn;
774
+ pendingSideDropRef.current = {
775
+ element: activeColumn,
776
+ direction: activeDirection
777
+ };
714
778
  } else {
715
- activeDragElRef.current = null;
779
+ clearAllDragStyles();
716
780
  }
717
781
  return;
718
782
  }
@@ -727,32 +791,46 @@ var SideToolbar = function SideToolbar() {
727
791
  target.el.classList.remove('sdoc-dragging-right');
728
792
  target.el.classList.remove('sdoc-dragging');
729
793
  activeDragElRef.current = target.el;
794
+ pendingSideDropRef.current = {
795
+ element: target.el,
796
+ direction: 'left'
797
+ };
730
798
  } else if (isRightDropZone) {
731
799
  target.el.classList.add('sdoc-dragging-right');
732
800
  target.el.classList.remove('sdoc-dragging-left');
733
801
  target.el.classList.remove('sdoc-dragging');
734
802
  activeDragElRef.current = target.el;
803
+ pendingSideDropRef.current = {
804
+ element: target.el,
805
+ direction: 'right'
806
+ };
735
807
  } else {
736
- activeDragElRef.current = null;
808
+ clearAllDragStyles();
737
809
  }
738
- }, [editor]);
739
- var clearAllDragStyles = (0, _react.useCallback)(function () {
740
- var el = activeDragElRef.current;
741
- (0, _helpers2.clearDragClass)(el);
742
- activeDragElRef.current = null;
743
- }, []);
810
+ }, [clearAllDragStyles, editor, getEditorContainer, isEditorDrag]);
811
+ var handleDragLeave = (0, _react.useCallback)(function (event) {
812
+ var editorContainer = event.currentTarget;
813
+ var relatedTarget = event.relatedTarget;
814
+
815
+ // Ignore dragleave events from descendants. Some browsers report a null
816
+ // relatedTarget when moving between block elements, so clearing here
817
+ // would remove the active drop zone before the drop event arrives.
818
+ var isLeavingEditor = event.target === editorContainer && (!relatedTarget || !editorContainer.contains(relatedTarget));
819
+ if (isLeavingEditor) clearAllDragStyles();
820
+ }, [clearAllDragStyles]);
744
821
  var handleDrop = (0, _react.useCallback)(function () {
745
- var targetEl = activeDragElRef.current;
746
- var hasSideDropClass = (targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.contains('sdoc-dragging-left')) || (targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.contains('sdoc-dragging-right'));
747
- if (!hasSideDropClass) return false;
748
- var _getNodeEntry1 = (0, _helpers2.getNodeEntry)(editor, targetEl),
749
- _getNodeEntry10 = (0, _slicedToArray2["default"])(_getNodeEntry1, 2),
750
- targetNode = _getNodeEntry10[0],
751
- targetPath = _getNodeEntry10[1];
752
- var _getNodeEntry11 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
753
- _getNodeEntry12 = (0, _slicedToArray2["default"])(_getNodeEntry11, 2),
754
- sourceNode = _getNodeEntry12[0],
755
- sourcePath = _getNodeEntry12[1];
822
+ var pendingDrop = pendingSideDropRef.current;
823
+ var targetEl = (pendingDrop === null || pendingDrop === void 0 ? void 0 : pendingDrop.element) || activeDragElRef.current;
824
+ var direction = (pendingDrop === null || pendingDrop === void 0 ? void 0 : pendingDrop.direction) || (targetEl !== null && targetEl !== void 0 && targetEl.classList.contains('sdoc-dragging-left') ? 'left' : null) || (targetEl !== null && targetEl !== void 0 && targetEl.classList.contains('sdoc-dragging-right') ? 'right' : null);
825
+ if (!targetEl || !direction) return false;
826
+ var _getSafeNodeEntry1 = getSafeNodeEntry(editor, targetEl),
827
+ _getSafeNodeEntry10 = (0, _slicedToArray2["default"])(_getSafeNodeEntry1, 2),
828
+ targetNode = _getSafeNodeEntry10[0],
829
+ targetPath = _getSafeNodeEntry10[1];
830
+ var _getSafeNodeEntry11 = getSafeNodeEntry(editor, sourceElementRef.current),
831
+ _getSafeNodeEntry12 = (0, _slicedToArray2["default"])(_getSafeNodeEntry11, 2),
832
+ sourceNode = _getSafeNodeEntry12[0],
833
+ sourcePath = _getSafeNodeEntry12[1];
756
834
  if (!targetNode || !targetPath || !sourceNode || !sourcePath) return false;
757
835
 
758
836
  // When source node is list child, it is equal to drag top list node
@@ -765,22 +843,24 @@ var SideToolbar = function SideToolbar() {
765
843
  if (_constants2.COLUMN === targetNode.type) {
766
844
  var topTargetNode = _slate.Node.get(editor, [targetPath[0]]); // Top multi column Node
767
845
  // Insert source node into last of multi column
768
- if (targetEl.classList.contains('sdoc-dragging-right')) {
846
+ if (direction === 'right') {
769
847
  (0, _helper2.addLastColumnInMultiColumn)(editor, topTargetNode, targetPath);
770
848
  _slate.Transforms.moveNodes(editor, {
771
849
  at: [sourcePath[0]],
772
850
  to: [targetPath[0], targetPath[1] + 1, 0]
773
851
  });
852
+ return true;
774
853
  }
775
854
  // Insert source node into middle of multi column
776
- if (targetEl.classList.contains('sdoc-dragging-left')) {
855
+ if (direction === 'left') {
777
856
  (0, _helper2.addMiddleColumnInMultiColumn)(editor, topTargetNode, targetPath);
778
857
  _slate.Transforms.moveNodes(editor, {
779
858
  at: [sourcePath[0]],
780
859
  to: [targetPath[0], targetPath[1], 0]
781
860
  });
861
+ return true;
782
862
  }
783
- return true;
863
+ return false;
784
864
  }
785
865
 
786
866
  // Drop non-multi column into non-multi column situation
@@ -791,14 +871,14 @@ var SideToolbar = function SideToolbar() {
791
871
  if (_slate.Path.equals([sourcePath[0]], [targetPath[0]])) return true;
792
872
  var leftNode = null;
793
873
  var rightNode = null;
794
- if (targetEl.classList.contains('sdoc-dragging-left')) {
874
+ if (direction === 'left') {
795
875
  leftNode = sourceNode;
796
876
  rightNode = targetNode;
797
- } else if (targetEl.classList.contains('sdoc-dragging-right')) {
877
+ } else if (direction === 'right') {
798
878
  leftNode = targetNode;
799
879
  rightNode = sourceNode;
800
880
  } else {
801
- return true;
881
+ return false;
802
882
  }
803
883
 
804
884
  // Form multi column first and then remove source and target node
@@ -812,40 +892,55 @@ var SideToolbar = function SideToolbar() {
812
892
  return true;
813
893
  }, [editor]);
814
894
  var handleDropCapture = (0, _react.useCallback)(function (event) {
815
- var _event$dataTransfer;
816
- var dragTypes = (_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types;
817
- if (!(dragTypes !== null && dragTypes !== void 0 && dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) || !activeDragElRef.current) return;
818
- var handled = handleDrop();
819
- if (!handled) return;
895
+ if (!isEditorDrag() || !pendingSideDropRef.current) return;
820
896
 
821
- // Block-level onDrop handlers stop propagation. Capture the event on the
822
- // article container so side drops are handled before those handlers run.
897
+ // Stop the normal block drop before mutating Slate. The actual target and
898
+ // direction were recorded during dragover, so this path does not depend
899
+ // on the final drop event target or on a final dragover being delivered.
823
900
  event.preventDefault();
824
901
  event.stopPropagation();
825
- clearAllDragStyles();
826
- sourceElement = null;
827
- targetElement = null;
828
- }, [clearAllDragStyles, handleDrop]);
902
+ var handled = handleDrop();
903
+ if (!handled) {
904
+ resetDragState();
905
+ return;
906
+ }
907
+ resetDragState();
908
+ }, [handleDrop, isEditorDrag, resetDragState]);
909
+ var handleDragEnd = (0, _react.useCallback)(function () {
910
+ // Both the document listener and React's onDragEnd can observe the same
911
+ // native event. Only the first one owns the drag session and may commit it.
912
+ if (!isDraggingEditorElementRef.current) return;
913
+
914
+ // Some deployed browsers do not deliver the drop event to the editor.
915
+ // The source draggable still receives dragend, so commit a pending side
916
+ // drop here as a fallback.
917
+ if (pendingSideDropRef.current) {
918
+ handleDrop();
919
+ }
920
+ resetDragState();
921
+ }, [handleDrop, resetDragState]);
829
922
  (0, _react.useEffect)(function () {
830
- var editorContainer = document.querySelector('.sdoc-article-container');
923
+ var editorContainer = getEditorContainer();
831
924
  if (!editorContainer) return undefined;
832
925
 
833
- // Use capture phase because block-level drag handlers stop propagation.
926
+ // Keep drag events scoped to the current editor container. Capture phase
927
+ // still lets this handler run before block-level handlers in the editor.
834
928
  editorContainer.addEventListener('dragover', handleDragover, true);
835
- editorContainer.addEventListener('dragend', clearAllDragStyles, true);
836
- editorContainer.addEventListener('dragleave', clearAllDragStyles, true);
929
+ editorContainer.addEventListener('dragend', handleDragEnd, true);
930
+ editorContainer.addEventListener('dragleave', handleDragLeave, true);
837
931
  editorContainer.addEventListener('drop', handleDropCapture, true);
838
932
  return function () {
839
933
  editorContainer.removeEventListener('dragover', handleDragover, true);
840
- editorContainer.removeEventListener('dragend', clearAllDragStyles, true);
841
- editorContainer.removeEventListener('dragleave', clearAllDragStyles, true);
934
+ editorContainer.removeEventListener('dragend', handleDragEnd, true);
935
+ editorContainer.removeEventListener('dragleave', handleDragLeave, true);
842
936
  editorContainer.removeEventListener('drop', handleDropCapture, true);
843
937
  };
844
- }, [handleDragover, clearAllDragStyles, handleDropCapture]);
938
+ }, [getEditorContainer, handleDragEnd, handleDragLeave, handleDragover, handleDropCapture]);
845
939
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
846
940
  onAnimationEnd: function onAnimationEnd() {
847
941
  return setIsMoving(false);
848
942
  },
943
+ ref: sideToolbarContainerRef,
849
944
  className: (0, _classnames["default"])('sdoc-side-toolbar-container d-print-none', {
850
945
  'fade-out': isMoving
851
946
  }),
@@ -855,6 +950,7 @@ var SideToolbar = function SideToolbar() {
855
950
  onMouseDown: onMouseDown,
856
951
  draggable: true,
857
952
  onDragStart: dragStart,
953
+ onDragEnd: handleDragEnd,
858
954
  className: "sdoc-side-op-icon",
859
955
  onClick: onShowSideMenuToggle,
860
956
  onMouseEnter: onMouseEnter,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.247",
3
+ "version": "3.0.249",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -71,5 +71,5 @@
71
71
  "publishConfig": {
72
72
  "access": "public"
73
73
  },
74
- "gitHead": "057969db030ac81ad1c976b6e961e9e4e86774e4"
74
+ "gitHead": "c7f6bb39019dd763b4a9bc3f55f04e397d09b04a"
75
75
  }