浏览代码

fix: Linear to elbow conversion crash (#9556)

* Fix linear to elbow conversion

* Add invariant check

* Add dev invariant fix

* Add arrowhead
Márk Tolmács 3 月之前
父节点
当前提交
91d36e9b81
共有 2 个文件被更改,包括 21 次插入1 次删除
  1. 19 0
      packages/element/src/elbowArrow.ts
  2. 2 1
      packages/excalidraw/components/ConvertElementTypePopup.tsx

+ 19 - 0
packages/element/src/elbowArrow.ts

@@ -974,6 +974,25 @@ export const updateElbowArrowPoints = (
         ),
       "Elbow arrow segments must be either horizontal or vertical",
     );
+
+    invariant(
+      updates.fixedSegments?.find(
+        (segment) =>
+          segment.index === 1 &&
+          pointsEqual(segment.start, (updates.points ?? arrow.points)[0]),
+      ) == null &&
+        updates.fixedSegments?.find(
+          (segment) =>
+            segment.index === (updates.points ?? arrow.points).length - 1 &&
+            pointsEqual(
+              segment.end,
+              (updates.points ?? arrow.points)[
+                (updates.points ?? arrow.points).length - 1
+              ],
+            ),
+        ) == null,
+      "The first and last segments cannot be fixed",
+    );
   }
 
   const fixedSegments = updates.fixedSegments ?? arrow.fixedSegments ?? [];

+ 2 - 1
packages/excalidraw/components/ConvertElementTypePopup.tsx

@@ -564,7 +564,7 @@ export const convertElementTypes = (
               continue;
             }
             const fixedSegments: FixedSegment[] = [];
-            for (let i = 0; i < nextPoints.length - 1; i++) {
+            for (let i = 1; i < nextPoints.length - 2; i++) {
               fixedSegments.push({
                 start: nextPoints[i],
                 end: nextPoints[i + 1],
@@ -581,6 +581,7 @@ export const convertElementTypes = (
             );
             mutateElement(element, app.scene.getNonDeletedElementsMap(), {
               ...updates,
+              endArrowhead: "arrow",
             });
           } else {
             // if we're converting to non-elbow linear element, check if