@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/.turbo/turbo-build.log +8 -8
- package/dist/index.js +120 -48
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +120 -48
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/EditorCanvas.tsx +145 -95
- package/src/index.tsx +74 -46
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
|
-
|
|
1196
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
1282
|
+
var _a;
|
|
1249
1283
|
if (!canvas) return;
|
|
1250
1284
|
const textObjects = canvas.getObjects().filter((item) => {
|
|
1251
|
-
var
|
|
1252
|
-
return ((
|
|
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
|
-
|
|
1271
|
-
|
|
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:
|
|
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
|
-
|
|
1385
|
+
resolve(imgData);
|
|
1342
1386
|
});
|
|
1343
|
-
}
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
2412
|
+
current.setVmml(vmmlState, pauseFrame);
|
|
2363
2413
|
} else {
|
|
2364
|
-
current.setVmml(
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 &&
|
|
2604
|
-
vmmlConverterRef.current
|
|
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
|
-
|
|
2607
|
-
|
|
2651
|
+
}, [canvasSize, vmmlState]);
|
|
2652
|
+
useEffect(() => {
|
|
2653
|
+
if (editableArray.length && (vmmlState == null ? void 0 : vmmlState.template)) {
|
|
2654
|
+
initCanEditClips(vmmlState.template.tracks);
|
|
2608
2655
|
}
|
|
2609
|
-
}, [
|
|
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 (
|
|
2612
|
-
initFcObjects(
|
|
2667
|
+
if (vmmlState) {
|
|
2668
|
+
initFcObjects(vmmlState.template.tracks);
|
|
2613
2669
|
}
|
|
2614
|
-
}, [
|
|
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(
|
|
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
|
-
[
|
|
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
|