@versa_ai/vmml-editor 1.0.15 → 1.0.16

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.mjs CHANGED
@@ -998,9 +998,11 @@ function usePeekControl(canvas, hideConfig) {
998
998
  return canvas;
999
999
  }
1000
1000
  var EditorCanvas = forwardRef(
1001
- ({ previewState, showCanvas, canvasSize, enterPreview, intoTextEdit, frame, vmml, dragState, initFcObjs, onVideoChange, isBatchModify, hideConfig }, ref) => {
1001
+ ({ previewState, showCanvas, canvasSize, enterPreview, intoTextEdit, frame, vmml, dragState, initFcObjs, editClips = [], onVideoChange, isBatchModify, hideConfig }, ref) => {
1002
1002
  const [fc, setFc] = useState(null);
1003
1003
  const [history, setHistory] = useState(null);
1004
+ const [canvasReady, setCanvasReady] = useState(false);
1005
+ const editRenderTime = useRef(0);
1004
1006
  const waitFcTasks = useRef([]);
1005
1007
  const vmmlConverterRef = useRef(null);
1006
1008
  const heightScaleRef = useRef(1);
@@ -1020,6 +1022,7 @@ var EditorCanvas = forwardRef(
1020
1022
  setFc(canvas);
1021
1023
  initCanvasEvent(canvas);
1022
1024
  usePeekControl(canvas, hideConfig);
1025
+ setCanvasReady(true);
1023
1026
  };
1024
1027
  const createFcObjs = (canvas) => {
1025
1028
  const ns = Math.floor(frame / 30 * 1e6);
@@ -1191,9 +1194,42 @@ var EditorCanvas = forwardRef(
1191
1194
  waitFcTasks.current.push(updateImage.bind(void 0, id, base64));
1192
1195
  }
1193
1196
  };
1197
+ const createEditObjes = async (canvas, time) => {
1198
+ const allObjects = canvas.getObjects();
1199
+ const toRemove = [];
1200
+ allObjects.forEach((obj) => {
1201
+ var _a;
1202
+ if ((_a = obj == null ? void 0 : obj.clipData) == null ? void 0 : _a.originClip) {
1203
+ toRemove.push(obj);
1204
+ }
1205
+ });
1206
+ toRemove.forEach((obj) => canvas.remove(obj));
1207
+ const promises = editClips.map((clip) => {
1208
+ if (clip.videoClip) {
1209
+ return createImageFromClip(clip);
1210
+ }
1211
+ if (clip.textClip && !clip.audioClip) {
1212
+ return createTextFromClip(clip);
1213
+ }
1214
+ });
1215
+ const res = await Promise.allSettled(promises);
1216
+ const objects = [];
1217
+ res.forEach((item) => {
1218
+ if (item.status === "fulfilled" && item.value) {
1219
+ objects.push(item.value);
1220
+ }
1221
+ });
1222
+ if (editRenderTime.current === time) {
1223
+ canvas.add(...objects).renderAll();
1224
+ }
1225
+ };
1194
1226
  const createImageFromClip = (clip, fc2) => {
1195
- const canvas = fc || fc2;
1196
- if (canvas && canvasSize.width) {
1227
+ return new Promise((resolve) => {
1228
+ const canvas = fc || fc2;
1229
+ if (!canvas || !canvasSize.width) {
1230
+ resolve(null);
1231
+ return;
1232
+ }
1197
1233
  const url = /video/g.test(clip.videoClip.mimeType) ? "" : clip.videoClip.sourceUrl;
1198
1234
  fabric.Image.fromURL(url, (img) => {
1199
1235
  const { dimension, posParam } = clip.videoClip;
@@ -1227,16 +1263,14 @@ var EditorCanvas = forwardRef(
1227
1263
  },
1228
1264
  visible: frame >= inFrame && frame < inFrame + durationFrame
1229
1265
  });
1230
- canvas.add(img);
1231
1266
  img.on("modified", () => {
1232
1267
  const fObj = convertToJSON(img);
1233
1268
  fObj.src = "";
1234
1269
  vmmlConverterRef.current.updateClip(fObj);
1235
1270
  });
1271
+ resolve(img);
1236
1272
  });
1237
- } else {
1238
- waitFcTasks.current.push(createImageFromClip.bind(void 0, clip));
1239
- }
1273
+ });
1240
1274
  };
1241
1275
  const handleRedo = () => {
1242
1276
  history.redo();
@@ -1245,11 +1279,11 @@ var EditorCanvas = forwardRef(
1245
1279
  history.undo();
1246
1280
  };
1247
1281
  const onBatchModify = (fObj, canvas) => {
1248
- console.log("onBatchModify>>>>>>>>>>>>>>>>>>>>>>>>");
1282
+ var _a;
1249
1283
  if (!canvas) return;
1250
1284
  const textObjects = canvas.getObjects().filter((item) => {
1251
- var _a;
1252
- return ((_a = item == null ? void 0 : item.clipData) == null ? void 0 : _a.type) === "\u6587\u5B57";
1285
+ var _a2;
1286
+ return ((_a2 = item == null ? void 0 : item.clipData) == null ? void 0 : _a2.type) === "\u6587\u5B57";
1253
1287
  });
1254
1288
  const { left, top, scaleX, scaleY, angle } = fObj;
1255
1289
  textObjects.forEach((textObj) => {
@@ -1265,10 +1299,20 @@ var EditorCanvas = forwardRef(
1265
1299
  vmmlConverterRef.current.updateClip(updatedFObj);
1266
1300
  });
1267
1301
  canvas.renderAll();
1302
+ const event = new CustomEvent("editor-vmml-batch-change", {
1303
+ detail: {
1304
+ vmml: ((_a = vmmlConverterRef.current) == null ? void 0 : _a.vmml) ?? null
1305
+ }
1306
+ });
1307
+ window.dispatchEvent(event);
1268
1308
  };
1269
1309
  const createTextFromClip = async (clip, fc2) => {
1270
- const canvas = fc || fc2;
1271
- if (canvas) {
1310
+ return new Promise(async (resolve) => {
1311
+ const canvas = fc || fc2;
1312
+ if (!canvas) {
1313
+ resolve(null);
1314
+ return;
1315
+ }
1272
1316
  const { width, height } = vmml.template.dimension;
1273
1317
  const fontSize = getFontSize(width, height);
1274
1318
  const { textContent, backgroundColor, textColor, posParam, fontAssetUrl, alignType } = clip.textClip;
@@ -1306,7 +1350,7 @@ var EditorCanvas = forwardRef(
1306
1350
  originX: "center",
1307
1351
  originY: "center",
1308
1352
  clipData: {
1309
- id: v4(),
1353
+ id: clip.id,
1310
1354
  inPoint: clip.inPoint,
1311
1355
  inFrame: getFrames(clip.inPoint, 30),
1312
1356
  type: "\u6587\u5B57",
@@ -1338,11 +1382,9 @@ var EditorCanvas = forwardRef(
1338
1382
  vmmlConverterRef.current.updateClip(fObj);
1339
1383
  }
1340
1384
  });
1341
- canvas.add(imgData).renderAll();
1385
+ resolve(imgData);
1342
1386
  });
1343
- } else {
1344
- waitFcTasks.current.push(createTextFromClip.bind(void 0, clip));
1345
- }
1387
+ });
1346
1388
  };
1347
1389
  const getFontFamilyName = (url) => {
1348
1390
  const filename = url.split("/").pop() || "";
@@ -1521,6 +1563,12 @@ var EditorCanvas = forwardRef(
1521
1563
  vmmlConverterRef.current = new VmmlConverter_default({ vmml, canvasSize });
1522
1564
  }
1523
1565
  }, [canvasSize, vmml]);
1566
+ useEffect(() => {
1567
+ if (editClips.length && canvasReady && fc) {
1568
+ editRenderTime.current = Date.now();
1569
+ createEditObjes(fc, editRenderTime.current);
1570
+ }
1571
+ }, [editClips, canvasReady]);
1524
1572
  useEffect(() => {
1525
1573
  if (fc) {
1526
1574
  const historyClass2 = new HistoryClass(fc);
@@ -2311,7 +2359,7 @@ var VideoMenu = ({ createImage, videoMenus, menuState }) => {
2311
2359
  var VideoMenu_default = VideoMenu;
2312
2360
  var historyClass = new HistoryClass();
2313
2361
  var EditorFn = ({
2314
- vmml,
2362
+ vmml: propVmml,
2315
2363
  pauseFrame = 0,
2316
2364
  maxText = 10,
2317
2365
  maxVideo = 5,
@@ -2328,7 +2376,7 @@ var EditorFn = ({
2328
2376
  // { hideDelete: false, hideEdit: false, hideMute: false, hideVolume: false }
2329
2377
  }, ref) => {
2330
2378
  var _a;
2331
- vmml = convertVmmlTextScaleByForbidden(vmml);
2379
+ const [vmmlState, setVmmlState] = useState(() => convertVmmlTextScaleByForbidden(propVmml));
2332
2380
  const textMenuRef = useRef(null);
2333
2381
  const vmmlPlayerRef = useRef();
2334
2382
  const canvasRef = useRef();
@@ -2340,7 +2388,7 @@ var EditorFn = ({
2340
2388
  const [isPlaying, setIsPlaying] = useState(false);
2341
2389
  const [showCanvas, setShowCanvas] = useState(false);
2342
2390
  const [filterIds, setFilterIds] = useState([]);
2343
- const [durationInFrames, setDurationInFrames] = useState(getFrames(((_a = vmml == null ? void 0 : vmml.template) == null ? void 0 : _a.duration) || 1, fps));
2391
+ const [durationInFrames, setDurationInFrames] = useState(getFrames(((_a = vmmlState == null ? void 0 : vmmlState.template) == null ? void 0 : _a.duration) || 1, fps));
2344
2392
  const [previewState, setPreviewState] = useState(true);
2345
2393
  const [menuState, setMenuState] = useState("");
2346
2394
  const [canvasSize, setCanvasSize] = useState({ width: 0, height: 0, top: 0 });
@@ -2353,15 +2401,17 @@ var EditorFn = ({
2353
2401
  const [dragState, setDragState] = useState(0);
2354
2402
  const vmmlConverterRef = useRef(null);
2355
2403
  const [initFcObjs, setInitFcObjs] = useState([]);
2404
+ const [editClips, setEditClips] = useState([]);
2405
+ const [refreshEdit, setRefreshEdit] = useState(0);
2356
2406
  const vmmlFlag = useRef(false);
2357
2407
  const needPlay = useRef(true);
2358
2408
  const setVmml = () => {
2359
2409
  const { current } = vmmlPlayerRef;
2360
2410
  if (!current) return;
2361
2411
  if (!once.current) {
2362
- current.setVmml(vmml, pauseFrame);
2412
+ current.setVmml(vmmlState, pauseFrame);
2363
2413
  } else {
2364
- current.setVmml(vmml, frame);
2414
+ current.setVmml(vmmlState, frame);
2365
2415
  }
2366
2416
  };
2367
2417
  const onPlayerReady = () => {
@@ -2535,18 +2585,9 @@ var EditorFn = ({
2535
2585
  setBuffering(false);
2536
2586
  };
2537
2587
  const initCanEditClips = (tracks = []) => {
2538
- if (editableArray.length) {
2588
+ if (editableArray.length && tracks.length) {
2539
2589
  const list = findEditClips(tracks);
2540
- if (list.length) {
2541
- const { current } = canvasRef;
2542
- list.forEach((clip) => {
2543
- if (clip.videoClip) {
2544
- current.createImageFromClip(clip);
2545
- } else {
2546
- if (!clip.audioClip) current.createTextFromClip(clip);
2547
- }
2548
- });
2549
- }
2590
+ setEditClips(list);
2550
2591
  }
2551
2592
  };
2552
2593
  const findEditClips = (tracks = []) => {
@@ -2574,7 +2615,7 @@ var EditorFn = ({
2574
2615
  };
2575
2616
  const getVmml = () => {
2576
2617
  try {
2577
- const tracks = vmml.template.tracks.filter((item) => item.editorType === "\u6587\u5B57");
2618
+ const tracks = vmmlState.template.tracks.filter((item) => item.editorType === "\u6587\u5B57");
2578
2619
  tracks.forEach((track) => {
2579
2620
  track.clips.forEach((clip) => {
2580
2621
  clip.fObj.src = "";
@@ -2583,7 +2624,7 @@ var EditorFn = ({
2583
2624
  } catch {
2584
2625
  console.log("\u51FA\u9519\u4E86");
2585
2626
  }
2586
- return vmml;
2627
+ return vmmlState;
2587
2628
  };
2588
2629
  const getPlayer = () => {
2589
2630
  return player;
@@ -2600,18 +2641,33 @@ var EditorFn = ({
2600
2641
  }
2601
2642
  }, [previewState]);
2602
2643
  useEffect(() => {
2603
- if (canvasSize.width && canvasSize.height && !vmmlConverterRef.current && vmml) {
2604
- vmmlConverterRef.current = new VmmlConverter_default({ vmml, canvasSize });
2644
+ if (canvasSize.width && canvasSize.height && vmmlState) {
2645
+ if (!vmmlConverterRef.current) {
2646
+ vmmlConverterRef.current = new VmmlConverter_default({ vmml: vmmlState, canvasSize });
2647
+ } else {
2648
+ vmmlConverterRef.current.vmml = vmmlState;
2649
+ }
2605
2650
  }
2606
- if (canvasSize.width) {
2607
- initCanEditClips(vmml.template.tracks);
2651
+ }, [canvasSize, vmmlState]);
2652
+ useEffect(() => {
2653
+ if (editableArray.length && (vmmlState == null ? void 0 : vmmlState.template)) {
2654
+ initCanEditClips(vmmlState.template.tracks);
2608
2655
  }
2609
- }, [canvasSize, vmml]);
2656
+ }, [editableArray, refreshEdit]);
2657
+ useEffect(() => {
2658
+ var _a2;
2659
+ if (propVmml) {
2660
+ const convertedVmml = convertVmmlTextScaleByForbidden(propVmml);
2661
+ setVmmlState(convertedVmml);
2662
+ setDurationInFrames(getFrames(((_a2 = propVmml == null ? void 0 : propVmml.template) == null ? void 0 : _a2.duration) || 1, fps));
2663
+ setRefreshEdit(Date.now());
2664
+ }
2665
+ }, [propVmml]);
2610
2666
  useEffect(() => {
2611
- if (vmml) {
2612
- initFcObjects(vmml.template.tracks);
2667
+ if (vmmlState) {
2668
+ initFcObjects(vmmlState.template.tracks);
2613
2669
  }
2614
- }, [vmml]);
2670
+ }, [vmmlState]);
2615
2671
  useEffect(() => {
2616
2672
  if (player) {
2617
2673
  const parent = player.getContainerNode();
@@ -2646,7 +2702,7 @@ var EditorFn = ({
2646
2702
  if (dragState === 2) {
2647
2703
  needPlay.current = false;
2648
2704
  const { current } = vmmlPlayerRef;
2649
- current.setVmml(vmml, frame, false);
2705
+ current.setVmml(vmmlState, frame, false);
2650
2706
  setShowCanvas(false);
2651
2707
  }
2652
2708
  if (dragState === 3 || dragState === 4) {
@@ -2654,6 +2710,20 @@ var EditorFn = ({
2654
2710
  setPreviewState(false);
2655
2711
  }
2656
2712
  }, [dragState]);
2713
+ const updateVmml = (v) => {
2714
+ var _a2;
2715
+ const { current: playerCurrent } = vmmlPlayerRef;
2716
+ const { current: canvasCurrent } = canvasRef;
2717
+ if (!playerCurrent) return;
2718
+ const convertedVmml = convertVmmlTextScaleByForbidden(v);
2719
+ setVmmlState(convertedVmml);
2720
+ setDurationInFrames(getFrames(((_a2 = v == null ? void 0 : v.template) == null ? void 0 : _a2.duration) || 1, fps));
2721
+ playerCurrent.setVmml(convertedVmml, pauseFrame);
2722
+ setRefreshEdit(Date.now());
2723
+ if (canvasCurrent) {
2724
+ canvasCurrent.checkObjectInPoint(pauseFrame);
2725
+ }
2726
+ };
2657
2727
  useImperativeHandle(
2658
2728
  ref,
2659
2729
  () => ({
@@ -2662,9 +2732,10 @@ var EditorFn = ({
2662
2732
  getVmml,
2663
2733
  getPlayer,
2664
2734
  texteditClose,
2665
- textFinish
2735
+ textFinish,
2736
+ updateVmml
2666
2737
  }),
2667
- [vmml, player]
2738
+ [vmmlState, player]
2668
2739
  );
2669
2740
  const texteditClose = () => {
2670
2741
  if (textMenuRef) {
@@ -2694,7 +2765,7 @@ var EditorFn = ({
2694
2765
  VmmlPlayer,
2695
2766
  {
2696
2767
  ref: vmmlPlayerRef,
2697
- vmml,
2768
+ vmml: vmmlState,
2698
2769
  existenceBorderRadio: true,
2699
2770
  moveToBeginningWhenEnded: true,
2700
2771
  muted: true,
@@ -2715,9 +2786,10 @@ var EditorFn = ({
2715
2786
  enterPreview,
2716
2787
  intoTextEdit,
2717
2788
  frame,
2718
- vmml,
2789
+ vmml: vmmlState,
2719
2790
  dragState,
2720
2791
  initFcObjs,
2792
+ editClips,
2721
2793
  onVideoChange,
2722
2794
  isBatchModify,
2723
2795
  hideConfig