Browse Source

fix: repair invalid binding on restore & fix type check (#8133)

David Luzar 1 year ago
parent
commit
4dc4590f24

+ 21 - 1
packages/excalidraw/data/restore.ts

@@ -1,6 +1,7 @@
 import type {
   ExcalidrawElement,
   ExcalidrawElementType,
+  ExcalidrawLinearElement,
   ExcalidrawSelectionElement,
   ExcalidrawTextElement,
   FontFamilyValues,
@@ -21,7 +22,11 @@ import {
   isInvisiblySmallElement,
   refreshTextDimensions,
 } from "../element";
-import { isTextElement, isUsingAdaptiveRadius } from "../element/typeChecks";
+import {
+  isLinearElement,
+  isTextElement,
+  isUsingAdaptiveRadius,
+} from "../element/typeChecks";
 import { randomId } from "../random";
 import {
   DEFAULT_FONT_FAMILY,
@@ -460,6 +465,21 @@ export const restoreElements = (
         ),
       );
     }
+
+    if (isLinearElement(element)) {
+      if (
+        element.startBinding &&
+        !restoredElementsMap.has(element.startBinding.elementId)
+      ) {
+        (element as Mutable<ExcalidrawLinearElement>).startBinding = null;
+      }
+      if (
+        element.endBinding &&
+        !restoredElementsMap.has(element.endBinding.elementId)
+      ) {
+        (element as Mutable<ExcalidrawLinearElement>).endBinding = null;
+      }
+    }
   }
 
   return restoredElements;

+ 2 - 4
packages/excalidraw/element/binding.ts

@@ -188,10 +188,8 @@ const getOriginalBindingIfStillCloseOfLinearElementEdge = (
       ? linearElement.startBinding?.elementId
       : linearElement.endBinding?.elementId;
   if (elementId) {
-    const element = elementsMap.get(
-      elementId,
-    ) as NonDeleted<ExcalidrawBindableElement>;
-    if (bindingBorderTest(element, coors, app)) {
+    const element = elementsMap.get(elementId);
+    if (isBindableElement(element) && bindingBorderTest(element, coors, app)) {
       return element;
     }
   }

+ 1 - 1
packages/excalidraw/element/typeChecks.ts

@@ -132,7 +132,7 @@ export const isBindingElementType = (
 };
 
 export const isBindableElement = (
-  element: ExcalidrawElement | null,
+  element: ExcalidrawElement | null | undefined,
   includeLocked = true,
 ): element is ExcalidrawBindableElement => {
   return (