sense-react-timeline-editor 1.0.3 → 1.0.6

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.js CHANGED
@@ -6,6 +6,8 @@ var React = require('react');
6
6
  var reactVirtualized = require('react-virtualized');
7
7
  var frameworkUtils = require('framework-utils');
8
8
  var interact = require('interactjs');
9
+ var es = require('antd/es');
10
+ var howler = require('howler');
9
11
  var lodashEs = require('lodash-es');
10
12
 
11
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -28,6 +30,31 @@ function _assertThisInitialized(e) {
28
30
  if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
29
31
  return e;
30
32
  }
33
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
34
+ try {
35
+ var i = n[a](c),
36
+ u = i.value;
37
+ } catch (n) {
38
+ return void e(n);
39
+ }
40
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
41
+ }
42
+ function _asyncToGenerator(n) {
43
+ return function () {
44
+ var t = this,
45
+ e = arguments;
46
+ return new Promise(function (r, o) {
47
+ var a = n.apply(t, e);
48
+ function _next(n) {
49
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
50
+ }
51
+ function _throw(n) {
52
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
53
+ }
54
+ _next(void 0);
55
+ });
56
+ };
57
+ }
31
58
  function _callSuper(t, o, e) {
32
59
  return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));
33
60
  }
@@ -140,6 +167,114 @@ function _possibleConstructorReturn(t, e) {
140
167
  if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined");
141
168
  return _assertThisInitialized(t);
142
169
  }
170
+ function _regenerator() {
171
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
172
+ var e,
173
+ t,
174
+ r = "function" == typeof Symbol ? Symbol : {},
175
+ n = r.iterator || "@@iterator",
176
+ o = r.toStringTag || "@@toStringTag";
177
+ function i(r, n, o, i) {
178
+ var c = n && n.prototype instanceof Generator ? n : Generator,
179
+ u = Object.create(c.prototype);
180
+ return _regeneratorDefine(u, "_invoke", function (r, n, o) {
181
+ var i,
182
+ c,
183
+ u,
184
+ f = 0,
185
+ p = o || [],
186
+ y = !1,
187
+ G = {
188
+ p: 0,
189
+ n: 0,
190
+ v: e,
191
+ a: d,
192
+ f: d.bind(e, 4),
193
+ d: function (t, r) {
194
+ return i = t, c = 0, u = e, G.n = r, a;
195
+ }
196
+ };
197
+ function d(r, n) {
198
+ for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
199
+ var o,
200
+ i = p[t],
201
+ d = G.p,
202
+ l = i[2];
203
+ r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
204
+ }
205
+ if (o || r > 1) return a;
206
+ throw y = !0, n;
207
+ }
208
+ return function (o, p, l) {
209
+ if (f > 1) throw TypeError("Generator is already running");
210
+ for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
211
+ i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
212
+ try {
213
+ if (f = 2, i) {
214
+ if (c || (o = "next"), t = i[o]) {
215
+ if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
216
+ if (!t.done) return t;
217
+ u = t.value, c < 2 && (c = 0);
218
+ } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
219
+ i = e;
220
+ } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
221
+ } catch (t) {
222
+ i = e, c = 1, u = t;
223
+ } finally {
224
+ f = 1;
225
+ }
226
+ }
227
+ return {
228
+ value: t,
229
+ done: y
230
+ };
231
+ };
232
+ }(r, o, i), !0), u;
233
+ }
234
+ var a = {};
235
+ function Generator() {}
236
+ function GeneratorFunction() {}
237
+ function GeneratorFunctionPrototype() {}
238
+ t = Object.getPrototypeOf;
239
+ var c = [][n] ? t(t([][n]())) : (_regeneratorDefine(t = {}, n, function () {
240
+ return this;
241
+ }), t),
242
+ u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
243
+ function f(e) {
244
+ return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
245
+ }
246
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine(u), _regeneratorDefine(u, o, "Generator"), _regeneratorDefine(u, n, function () {
247
+ return this;
248
+ }), _regeneratorDefine(u, "toString", function () {
249
+ return "[object Generator]";
250
+ }), (_regenerator = function () {
251
+ return {
252
+ w: i,
253
+ m: f
254
+ };
255
+ })();
256
+ }
257
+ function _regeneratorDefine(e, r, n, t) {
258
+ var i = Object.defineProperty;
259
+ try {
260
+ i({}, "", {});
261
+ } catch (e) {
262
+ i = 0;
263
+ }
264
+ _regeneratorDefine = function (e, r, n, t) {
265
+ function o(r, n) {
266
+ _regeneratorDefine(e, r, function (e) {
267
+ return this._invoke(r, n, e);
268
+ });
269
+ }
270
+ r ? i ? i(e, r, {
271
+ value: n,
272
+ enumerable: !t,
273
+ configurable: !t,
274
+ writable: !t
275
+ }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
276
+ }, _regeneratorDefine(e, r, n, t);
277
+ }
143
278
  function _setPrototypeOf(t, e) {
144
279
  return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
145
280
  return t.__proto__ = e, t;
@@ -1111,54 +1246,140 @@ function prefix() {
1111
1246
  return frameworkUtils.prefixNames.apply(void 0, ["".concat(PREFIX, "-")].concat(classNames));
1112
1247
  }
1113
1248
 
1114
- var DEFAULT_SPEED = 1;
1115
- var MAX_SPEED = 3;
1116
- var CRITICAL_SIZE = 10;
1117
- function useAutoScroll(target) {
1249
+ var DEFAULT_SPEED = 2;
1250
+ var MAX_SPEED = 8;
1251
+ var CRITICAL_SIZE = 5;
1252
+ var EDGE_THRESHOLD = 20; // 距离边缘多少像素开始触发滚动
1253
+ function useAutoScroll(target, verticalScrollTarget) {
1118
1254
  var leftBoundRef = React.useRef(Number.MIN_SAFE_INTEGER);
1119
1255
  var rightBoundRef = React.useRef(Number.MAX_SAFE_INTEGER);
1256
+ var topBoundRef = React.useRef(Number.MIN_SAFE_INTEGER);
1257
+ var bottomBoundRef = React.useRef(Number.MAX_SAFE_INTEGER);
1120
1258
  var speed = React.useRef(DEFAULT_SPEED);
1121
1259
  var frame = React.useRef();
1122
1260
  var initAutoScroll = function initAutoScroll() {
1123
1261
  if (target === null || target === void 0 ? void 0 : target.current) {
1124
1262
  var _target$current$getBo = target.current.getBoundingClientRect(),
1125
1263
  left = _target$current$getBo.left,
1126
- width = _target$current$getBo.width;
1264
+ width = _target$current$getBo.width,
1265
+ top = _target$current$getBo.top,
1266
+ height = _target$current$getBo.height;
1127
1267
  leftBoundRef.current = left;
1128
1268
  rightBoundRef.current = left + width;
1269
+ // Use verticalScrollTarget for Y-axis bounds if provided
1270
+ if (verticalScrollTarget === null || verticalScrollTarget === void 0 ? void 0 : verticalScrollTarget.current) {
1271
+ var verticalRect = verticalScrollTarget.current.getBoundingClientRect();
1272
+ topBoundRef.current = verticalRect.top;
1273
+ bottomBoundRef.current = verticalRect.top + verticalRect.height;
1274
+ } else {
1275
+ topBoundRef.current = top;
1276
+ bottomBoundRef.current = top + height;
1277
+ }
1129
1278
  }
1130
1279
  };
1131
- var dealDragAutoScroll = function dealDragAutoScroll(e, deltaScroll) {
1132
- // 超出
1133
- if (e.clientX >= rightBoundRef.current || e.clientX <= leftBoundRef.current) {
1280
+ var dealDragAutoScroll = function dealDragAutoScroll(e, deltaScroll, deltaScrollTop) {
1281
+ // X轴滚动 - 在边缘附近就开始触发
1282
+ var distanceToRightEdge = rightBoundRef.current - e.clientX;
1283
+ var distanceToLeftEdge = e.clientX - leftBoundRef.current;
1284
+ if (distanceToRightEdge < EDGE_THRESHOLD && distanceToRightEdge > 0) {
1285
+ // 接近右边缘
1134
1286
  cancelAnimationFrame(frame.current);
1135
- var over = Math.abs(e.clientX >= rightBoundRef.current ? e.clientX - rightBoundRef.current : e.clientX - leftBoundRef.current);
1136
- speed.current = Math.min(Number((over / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED, MAX_SPEED);
1137
- var dir = e.clientX >= rightBoundRef.current ? 1 : -1;
1138
- var delta = dir * speed.current;
1287
+ var proximity = EDGE_THRESHOLD - distanceToRightEdge;
1288
+ speed.current = Math.min(Math.max(1, Number((proximity / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED), MAX_SPEED);
1289
+ var delta = speed.current;
1139
1290
  var _loop = function loop() {
1140
1291
  deltaScroll && deltaScroll(delta);
1141
1292
  frame.current = requestAnimationFrame(_loop);
1142
1293
  };
1143
1294
  frame.current = requestAnimationFrame(_loop);
1144
1295
  return false;
1296
+ } else if (distanceToLeftEdge < EDGE_THRESHOLD && distanceToLeftEdge > 0) {
1297
+ // 接近左边缘
1298
+ cancelAnimationFrame(frame.current);
1299
+ var _proximity = EDGE_THRESHOLD - distanceToLeftEdge;
1300
+ speed.current = Math.min(Math.max(1, Number((_proximity / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED), MAX_SPEED);
1301
+ var _delta = -speed.current;
1302
+ var _loop2 = function loop() {
1303
+ deltaScroll && deltaScroll(_delta);
1304
+ frame.current = requestAnimationFrame(_loop2);
1305
+ };
1306
+ frame.current = requestAnimationFrame(_loop2);
1307
+ return false;
1308
+ }
1309
+ // Y轴滚动 - 根据拖拽方向判断
1310
+ else if (deltaScrollTop) {
1311
+ var distanceToBottomEdge = bottomBoundRef.current - e.clientY;
1312
+ var distanceToTopEdge = e.clientY - topBoundRef.current;
1313
+ // console.log('Y-axis check:', {
1314
+ // clientY: e.clientY,
1315
+ // dy: e.dy,
1316
+ // topBound: topBoundRef.current,
1317
+ // bottomBound: bottomBoundRef.current,
1318
+ // distanceToTop: distanceToTopEdge,
1319
+ // distanceToBottom: distanceToBottomEdge,
1320
+ // });
1321
+ // 向下拖拽且接近底部边缘
1322
+ if (e.dy > 0 && distanceToBottomEdge < EDGE_THRESHOLD && distanceToBottomEdge > 0) {
1323
+ // console.log('Triggering BOTTOM scroll (dragging DOWN), delta will be POSITIVE');
1324
+ cancelAnimationFrame(frame.current);
1325
+ var _proximity2 = EDGE_THRESHOLD - distanceToBottomEdge;
1326
+ speed.current = Math.min(Math.max(1, Number((_proximity2 / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED), MAX_SPEED);
1327
+ var _delta2 = speed.current;
1328
+ var _loop3 = function loop() {
1329
+ deltaScrollTop && deltaScrollTop(_delta2);
1330
+ frame.current = requestAnimationFrame(_loop3);
1331
+ };
1332
+ frame.current = requestAnimationFrame(_loop3);
1333
+ return false;
1334
+ }
1335
+ // 向上拖拽且接近顶部边缘
1336
+ else if (e.dy < 0 && distanceToTopEdge < EDGE_THRESHOLD && distanceToTopEdge > 0) {
1337
+ // console.log('Triggering TOP scroll (dragging UP), delta will be NEGATIVE');
1338
+ cancelAnimationFrame(frame.current);
1339
+ var _proximity3 = EDGE_THRESHOLD - distanceToTopEdge;
1340
+ speed.current = Math.min(Math.max(1, Number((_proximity3 / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED), MAX_SPEED);
1341
+ var _delta3 = -speed.current;
1342
+ var _loop4 = function loop() {
1343
+ deltaScrollTop && deltaScrollTop(_delta3);
1344
+ frame.current = requestAnimationFrame(_loop4);
1345
+ };
1346
+ frame.current = requestAnimationFrame(_loop4);
1347
+ return false;
1348
+ } else {
1349
+ cancelAnimationFrame(frame.current);
1350
+ }
1145
1351
  } else {
1146
1352
  cancelAnimationFrame(frame.current);
1147
1353
  }
1148
1354
  return true;
1149
1355
  };
1150
1356
  var dealResizeAutoScroll = function dealResizeAutoScroll(e, dir, deltaScroll) {
1151
- if (e.clientX >= rightBoundRef.current || e.clientX < leftBoundRef.current) {
1357
+ // X轴滚动 - 在边缘附近就开始触发
1358
+ var distanceToRightEdge = rightBoundRef.current - e.clientX;
1359
+ var distanceToLeftEdge = e.clientX - leftBoundRef.current;
1360
+ if (distanceToRightEdge < EDGE_THRESHOLD && distanceToRightEdge > 0) {
1361
+ // 接近右边缘
1152
1362
  cancelAnimationFrame(frame.current);
1153
- var over = Math.abs(e.clientX >= rightBoundRef.current ? e.clientX - rightBoundRef.current : e.clientX - leftBoundRef.current);
1154
- speed.current = Math.min(Number((over / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED, MAX_SPEED);
1155
- var direction = e.clientX >= rightBoundRef.current ? 1 : -1;
1156
- var delta = direction * speed.current;
1157
- var _loop2 = function loop() {
1363
+ var proximity = EDGE_THRESHOLD - distanceToRightEdge;
1364
+ speed.current = Math.min(Math.max(1, Number((proximity / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED), MAX_SPEED);
1365
+ var delta = speed.current;
1366
+ var _loop5 = function loop() {
1158
1367
  deltaScroll && deltaScroll(delta);
1159
- frame.current = requestAnimationFrame(_loop2);
1368
+ frame.current = requestAnimationFrame(_loop5);
1160
1369
  };
1161
- frame.current = requestAnimationFrame(_loop2);
1370
+ frame.current = requestAnimationFrame(_loop5);
1371
+ return false;
1372
+ } else if (distanceToLeftEdge < EDGE_THRESHOLD && distanceToLeftEdge > 0) {
1373
+ // 接近左边缘
1374
+ cancelAnimationFrame(frame.current);
1375
+ var _proximity4 = EDGE_THRESHOLD - distanceToLeftEdge;
1376
+ speed.current = Math.min(Math.max(1, Number((_proximity4 / CRITICAL_SIZE).toFixed(0)) * DEFAULT_SPEED), MAX_SPEED);
1377
+ var _delta4 = -speed.current;
1378
+ var _loop6 = function loop() {
1379
+ deltaScroll && deltaScroll(_delta4);
1380
+ frame.current = requestAnimationFrame(_loop6);
1381
+ };
1382
+ frame.current = requestAnimationFrame(_loop6);
1162
1383
  return false;
1163
1384
  } else {
1164
1385
  cancelAnimationFrame(frame.current);
@@ -1261,12 +1482,14 @@ var RowDnd = /*#__PURE__*/React__default['default'].forwardRef(function (_ref, r
1261
1482
  onDragEnd = _ref.onDragEnd,
1262
1483
  onDrag = _ref.onDrag,
1263
1484
  parentRef = _ref.parentRef,
1264
- deltaScrollLeft = _ref.deltaScrollLeft;
1485
+ deltaScrollLeft = _ref.deltaScrollLeft,
1486
+ deltaScrollTop = _ref.deltaScrollTop,
1487
+ verticalScrollRef = _ref.verticalScrollRef;
1265
1488
  var interactable = React.useRef();
1266
1489
  var deltaX = React.useRef(0);
1267
1490
  var deltaY = React.useRef(0);
1268
1491
  var isAdsorption = React.useRef(false);
1269
- var _useAutoScroll = useAutoScroll(parentRef),
1492
+ var _useAutoScroll = useAutoScroll(parentRef, verticalScrollRef),
1270
1493
  initAutoScroll = _useAutoScroll.initAutoScroll,
1271
1494
  dealDragAutoScroll = _useAutoScroll.dealDragAutoScroll,
1272
1495
  dealResizeAutoScroll = _useAutoScroll.dealResizeAutoScroll,
@@ -1467,14 +1690,33 @@ var RowDnd = /*#__PURE__*/React__default['default'].forwardRef(function (_ref, r
1467
1690
  preHeight: preHeight,
1468
1691
  scrollDelta: delta
1469
1692
  });
1470
- });
1693
+ }, deltaScrollTop ? function (delta) {
1694
+ deltaScrollTop(delta);
1695
+ // Y轴自动滚动时,需要累加到 deltaY.current 以保持元素与鼠标的相对位置
1696
+ var _target$dataset6 = target.dataset,
1697
+ left = _target$dataset6.left,
1698
+ width = _target$dataset6.width,
1699
+ top = _target$dataset6.top,
1700
+ height = _target$dataset6.height;
1701
+ var preLeft = parseFloat(left || '0');
1702
+ var preWidth = parseFloat(width || '0');
1703
+ var preTop = parseFloat(top || '0');
1704
+ var preHeight = parseFloat(height || '0');
1705
+ deltaY.current += delta;
1706
+ move({
1707
+ preLeft: preLeft,
1708
+ preWidth: preWidth,
1709
+ preTop: preTop,
1710
+ preHeight: preHeight
1711
+ });
1712
+ } : undefined);
1471
1713
  if (!result) return;
1472
1714
  }
1473
- var _target$dataset6 = target.dataset,
1474
- left = _target$dataset6.left,
1475
- width = _target$dataset6.width,
1476
- top = _target$dataset6.top,
1477
- height = _target$dataset6.height;
1715
+ var _target$dataset7 = target.dataset,
1716
+ left = _target$dataset7.left,
1717
+ width = _target$dataset7.width,
1718
+ top = _target$dataset7.top,
1719
+ height = _target$dataset7.height;
1478
1720
  var preLeft = parseFloat(left || '0');
1479
1721
  var preWidth = parseFloat(width || '0');
1480
1722
  var preTop = parseFloat(top || '0');
@@ -1494,11 +1736,11 @@ var RowDnd = /*#__PURE__*/React__default['default'].forwardRef(function (_ref, r
1494
1736
  isAdsorption.current = false;
1495
1737
  stopAutoScroll();
1496
1738
  var target = e.target;
1497
- var _target$dataset7 = target.dataset,
1498
- left = _target$dataset7.left,
1499
- width = _target$dataset7.width,
1500
- top = _target$dataset7.top,
1501
- height = _target$dataset7.height;
1739
+ var _target$dataset8 = target.dataset,
1740
+ left = _target$dataset8.left,
1741
+ width = _target$dataset8.width,
1742
+ top = _target$dataset8.top,
1743
+ height = _target$dataset8.height;
1502
1744
  onDragEnd && onDragEnd({
1503
1745
  left: parseFloat(left),
1504
1746
  width: parseFloat(width),
@@ -1607,9 +1849,9 @@ var RowDnd = /*#__PURE__*/React__default['default'].forwardRef(function (_ref, r
1607
1849
  if (deltaScrollLeft && (parentRef === null || parentRef === void 0 ? void 0 : parentRef.current)) {
1608
1850
  var result = dealResizeAutoScroll(e, dir, function (delta) {
1609
1851
  deltaScrollLeft(delta);
1610
- var _target$dataset8 = target.dataset,
1611
- left = _target$dataset8.left,
1612
- width = _target$dataset8.width;
1852
+ var _target$dataset9 = target.dataset,
1853
+ left = _target$dataset9.left,
1854
+ width = _target$dataset9.width;
1613
1855
  var preLeft = parseFloat(left || '0');
1614
1856
  var preWidth = parseFloat(width || '0');
1615
1857
  deltaX.current += delta;
@@ -1621,9 +1863,9 @@ var RowDnd = /*#__PURE__*/React__default['default'].forwardRef(function (_ref, r
1621
1863
  });
1622
1864
  if (!result) return;
1623
1865
  }
1624
- var _target$dataset9 = target.dataset,
1625
- left = _target$dataset9.left,
1626
- width = _target$dataset9.width;
1866
+ var _target$dataset0 = target.dataset,
1867
+ left = _target$dataset0.left,
1868
+ width = _target$dataset0.width;
1627
1869
  var preLeft = parseFloat(left || '0');
1628
1870
  var preWidth = parseFloat(width || '0');
1629
1871
  deltaX.current += dir === 'left' ? e.deltaRect.left : e.deltaRect.right;
@@ -1639,9 +1881,9 @@ var RowDnd = /*#__PURE__*/React__default['default'].forwardRef(function (_ref, r
1639
1881
  isAdsorption.current = false;
1640
1882
  stopAutoScroll();
1641
1883
  var target = e.target;
1642
- var _target$dataset0 = target.dataset,
1643
- left = _target$dataset0.left,
1644
- width = _target$dataset0.width;
1884
+ var _target$dataset1 = target.dataset,
1885
+ left = _target$dataset1.left,
1886
+ width = _target$dataset1.width;
1645
1887
  var dir = ((_e$edges3 = e.edges) === null || _e$edges3 === void 0 ? void 0 : _e$edges3.right) ? 'right' : 'left';
1646
1888
  onResizeEnd && onResizeEnd(dir, {
1647
1889
  left: parseFloat(left),
@@ -1744,7 +1986,7 @@ var Cursor = function Cursor(_ref) {
1744
1986
  }
1745
1987
  }, [cursorTime, startLeft, scaleWidth, scale, scrollLeft]);
1746
1988
  return /*#__PURE__*/React__default['default'].createElement(RowDnd, {
1747
- top: theme === 'light' ? 40 : 0,
1989
+ top: theme === 'light' ? 16 : 0,
1748
1990
  start: startLeft,
1749
1991
  ref: rowRnd,
1750
1992
  parentRef: areaRef,
@@ -1844,12 +2086,14 @@ var DragLines = function DragLines(_ref) {
1844
2086
  }));
1845
2087
  };
1846
2088
 
1847
- var css_248z$2 = ".timeline-editor:hover .timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar {\n height: 4px;\n}\n.timeline-editor-edit-area {\n flex: 1 1 auto;\n margin-top: 10px;\n overflow: hidden;\n position: relative;\n}\n.timeline-editor-edit-area.no-flex {\n flex: 0 0 auto;\n}\n.timeline-editor-edit-area.overflow-hidden {\n overflow: hidden;\n}\n.timeline-editor-edit-area.overflow-hidden .ReactVirtualized__Grid {\n overflow: hidden !important;\n height: initial !important;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid {\n outline: none !important;\n overflow: overlay !important;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar-track {\n background-color: transparent !important;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar-thumb {\n background: #666;\n border-radius: 16px;\n}\n";
2089
+ var css_248z$2 = ".timeline-editor .ant-upload-wrapper .ant-upload-drag {\n border: none !important;\n background: none !important;\n}\n.timeline-editor:hover .timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar {\n height: 4px;\n}\n.timeline-editor-edit-area {\n flex: 1 1 auto;\n margin-top: 10px;\n overflow: hidden;\n position: relative;\n}\n.timeline-editor-edit-area.no-flex {\n flex: 0 0 auto;\n}\n.timeline-editor-edit-area.overflow-hidden {\n overflow: hidden;\n}\n.timeline-editor-edit-area.overflow-hidden .ReactVirtualized__Grid {\n overflow: hidden !important;\n height: initial !important;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid {\n outline: none !important;\n overflow: overlay !important;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar-track {\n background-color: transparent !important;\n}\n.timeline-editor-edit-area .ReactVirtualized__Grid::-webkit-scrollbar-thumb {\n background: #666;\n border-radius: 16px;\n}\n";
1848
2090
  styleInject(css_248z$2);
1849
2091
 
1850
- var css_248z$3 = ".timeline-editor-action {\n position: absolute;\n left: 0;\n top: 0;\n background-color: #c6cbd2;\n}\n.timeline-editor-action .timeline-editor-action-left-stretch,\n.timeline-editor-action .timeline-editor-action-right-stretch {\n position: absolute;\n top: 0;\n width: 10px;\n border-radius: 4px;\n height: 100%;\n overflow: hidden;\n}\n.timeline-editor-action .timeline-editor-action-left-stretch::after,\n.timeline-editor-action .timeline-editor-action-right-stretch::after {\n position: absolute;\n top: 0;\n bottom: 0;\n margin: auto;\n border-radius: 4px;\n border-top: 28px solid transparent;\n border-bottom: 28px solid transparent;\n}\n.timeline-editor-action .timeline-editor-action-left-stretch {\n left: 0;\n}\n.timeline-editor-action .timeline-editor-action-left-stretch::after {\n left: 0;\n content: \"\";\n border-left: 7px solid rgba(244, 4, 4, 0.202);\n border-right: 7px solid transparent;\n}\n.timeline-editor-action .timeline-editor-action-right-stretch {\n right: 0;\n}\n.timeline-editor-action .timeline-editor-action-right-stretch::after {\n right: 0;\n content: \"\";\n border-right: 7px solid rgba(244, 4, 4, 0.202);\n border-left: 7px solid transparent;\n}\n";
2092
+ var css_248z$3 = ".timeline-editor-action {\n position: absolute;\n left: 0;\n top: 0;\n background-color: #c6cbd2;\n display: flex;\n align-items: center;\n}\n.timeline-editor-action .timeline-editor-action-left-stretch,\n.timeline-editor-action .timeline-editor-action-right-stretch {\n position: absolute;\n}\n.timeline-editor-action .timeline-editor-action-left-stretch {\n left: -3px;\n}\n.timeline-editor-action .timeline-editor-action-right-stretch {\n right: -3px;\n transform: rotate(180deg);\n}\n";
1851
2093
  styleInject(css_248z$3);
1852
2094
 
2095
+ var stretchIcon = "data:image/svg+xml,%3Csvg%20width%3D%227%22%20height%3D%2216%22%20viewBox%3D%220%200%207%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M7%2015C7%2015.5523%206.55228%2016%206%2016L1%2016C0.447715%2016%201.06779e-08%2015.5523%202.38498e-08%2015L3.57746e-07%201C3.70918e-07%200.447715%200.447716%20-1.5627e-07%201%20-1.43099e-07L6%209.29825e-07C6.55229%209.42996e-07%207%200.447716%207%201L7%2015Z%22%20fill%3D%22%23226EFF%22%2F%3E%3Cpath%20d%3D%22M2%204L2%2012%22%20stroke%3D%22white%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M4%2012.25L5.5%208L4%203.75%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M4%2012.25L5.5%208L4%203.75L4%2012.25Z%22%20stroke%3D%22white%22%20stroke-width%3D%220.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E";
2096
+
1853
2097
  var EditAction = function EditAction(_ref) {
1854
2098
  var editorData = _ref.editorData,
1855
2099
  row = _ref.row,
@@ -1880,9 +2124,18 @@ var EditAction = function EditAction(_ref) {
1880
2124
  getActionRender = _ref.getActionRender,
1881
2125
  handleTime = _ref.handleTime,
1882
2126
  areaRef = _ref.areaRef,
1883
- deltaScrollLeft = _ref.deltaScrollLeft;
2127
+ deltaScrollLeft = _ref.deltaScrollLeft,
2128
+ _ref$allowCreateTrack = _ref.allowCreateTrack,
2129
+ allowCreateTrack = _ref$allowCreateTrack === void 0 ? true : _ref$allowCreateTrack,
2130
+ setDropPreview = _ref.setDropPreview,
2131
+ containerRef = _ref.containerRef;
1884
2132
  var rowRnd = React.useRef();
1885
2133
  var isDragWhenClick = React.useRef(false);
2134
+ var originalPosition = React.useRef({
2135
+ start: 0,
2136
+ end: 0
2137
+ });
2138
+ var isMounted = React.useRef(true); // 组件挂载状态
1886
2139
  var id = action.id,
1887
2140
  maxEnd = action.maxEnd,
1888
2141
  minStart = action.minStart,
@@ -1894,6 +2147,17 @@ var EditAction = function EditAction(_ref) {
1894
2147
  _action$movable = action.movable,
1895
2148
  movable = _action$movable === void 0 ? true : _action$movable,
1896
2149
  effectId = action.effectId;
2150
+ var handleDeltaScrollTop = function handleDeltaScrollTop(delta) {
2151
+ if (containerRef === null || containerRef === void 0 ? void 0 : containerRef.current) {
2152
+ containerRef.current.scrollTop += delta * 2;
2153
+ }
2154
+ };
2155
+ // 组件卸载时清理
2156
+ React.useEffect(function () {
2157
+ return function () {
2158
+ isMounted.current = false;
2159
+ };
2160
+ }, []);
1897
2161
  // 获取最大/最小 像素范围
1898
2162
  var leftLimit = parserTimeToPixel(minStart || 0, {
1899
2163
  startLeft: startLeft,
@@ -1954,6 +2218,11 @@ var EditAction = function EditAction(_ref) {
1954
2218
  };
1955
2219
  //#region [rgba(100,120,156,0.08)] 回调
1956
2220
  var handleDragStart = function handleDragStart() {
2221
+ // 保存原始位置
2222
+ originalPosition.current = {
2223
+ start: action.start,
2224
+ end: action.end
2225
+ };
1957
2226
  onActionMoveStart && onActionMoveStart({
1958
2227
  action: action,
1959
2228
  row: row
@@ -1964,6 +2233,34 @@ var EditAction = function EditAction(_ref) {
1964
2233
  width = _ref2.width,
1965
2234
  top = _ref2.top;
1966
2235
  isDragWhenClick.current = true;
2236
+ // 检查是否需要显示预览指示器
2237
+ if (allowCreateTrack && setDropPreview && top !== undefined) {
2238
+ var _currentRowIndex = editorData.findIndex(function (item) {
2239
+ return item.id === row.id;
2240
+ });
2241
+ var rowHeightValue = rowHeight || 32;
2242
+ // 添加阈值,避免边界处频繁切换
2243
+ var threshold = 0.2; // 降低阈值,使预览指示器更灵敏
2244
+ var preciseOffset = top / rowHeightValue;
2245
+ var preciseIndex = _currentRowIndex + preciseOffset;
2246
+ // 判断是否需要显示预览指示器
2247
+ if (preciseIndex < -threshold) {
2248
+ // 拖拽到顶部之前
2249
+ setDropPreview({
2250
+ position: 'before',
2251
+ rowIndex: 0
2252
+ });
2253
+ } else if (preciseIndex >= editorData.length - 1 + threshold) {
2254
+ // 拖拽到底部之后
2255
+ setDropPreview({
2256
+ position: 'after',
2257
+ rowIndex: editorData.length - 1
2258
+ });
2259
+ } else {
2260
+ // 在现有轨道范围内,不显示预览
2261
+ setDropPreview(null);
2262
+ }
2263
+ }
1967
2264
  if (onActionMoving) {
1968
2265
  var _parserTransformToTim = parserTransformToTime({
1969
2266
  left: left,
@@ -1983,11 +2280,13 @@ var EditAction = function EditAction(_ref) {
1983
2280
  });
1984
2281
  if (result === false) return false;
1985
2282
  }
1986
- setTransform({
1987
- left: left,
1988
- width: width,
1989
- top: top || 0
1990
- });
2283
+ if (isMounted.current) {
2284
+ setTransform({
2285
+ left: left,
2286
+ width: width,
2287
+ top: top || 0
2288
+ });
2289
+ }
1991
2290
  handleScaleCount(left, width);
1992
2291
  };
1993
2292
  var handleDragEnd = function handleDragEnd(_ref3) {
@@ -1995,6 +2294,10 @@ var EditAction = function EditAction(_ref) {
1995
2294
  width = _ref3.width,
1996
2295
  top = _ref3.top,
1997
2296
  height = _ref3.height;
2297
+ // 清理预览指示器
2298
+ if (setDropPreview) {
2299
+ setDropPreview(null);
2300
+ }
1998
2301
  // 计算时间
1999
2302
  var _parserTransformToTim2 = parserTransformToTime({
2000
2303
  left: left,
@@ -2010,20 +2313,72 @@ var EditAction = function EditAction(_ref) {
2010
2313
  var targetRowIndex = editorData.findIndex(function (item) {
2011
2314
  return item.id === row.id;
2012
2315
  });
2316
+ var needCreateNewRow = false;
2317
+ var newRowPosition = 'after';
2013
2318
  if (top !== undefined && height !== undefined) {
2014
2319
  // 通过Y轴位置计算目标row的索引
2015
- var currentRowIndex = editorData.findIndex(function (item) {
2320
+ var _currentRowIndex2 = editorData.findIndex(function (item) {
2016
2321
  return item.id === row.id;
2017
2322
  });
2018
2323
  var rowHeightValue = rowHeight || 32; // 使用默认行高或传入的行高
2019
- var rowOffset = Math.round(top / rowHeightValue);
2020
- targetRowIndex = Math.max(0, Math.min(currentRowIndex + rowOffset, editorData.length - 1));
2324
+ // 使用与预览指示器相同的阈值逻辑
2325
+ var threshold = 0.2;
2326
+ var preciseOffset = top / rowHeightValue;
2327
+ var preciseIndex = _currentRowIndex2 + preciseOffset;
2328
+ // 检查是否需要创建新轨道
2329
+ if (allowCreateTrack) {
2330
+ if (preciseIndex < -threshold) {
2331
+ // 拖拽到第一个轨道之前,需要在前面创建新轨道
2332
+ needCreateNewRow = true;
2333
+ newRowPosition = 'before';
2334
+ targetRowIndex = 0;
2335
+ } else if (preciseIndex >= editorData.length - 1 + threshold) {
2336
+ // 拖拽到最后一个轨道之后,需要在后面创建新轨道
2337
+ needCreateNewRow = true;
2338
+ newRowPosition = 'after';
2339
+ targetRowIndex = editorData.length;
2340
+ } else {
2341
+ // 在现有轨道范围内,使用四舍五入找到最近的轨道
2342
+ var rowOffset = Math.round(preciseOffset);
2343
+ targetRowIndex = Math.max(0, Math.min(_currentRowIndex2 + rowOffset, editorData.length - 1));
2344
+ }
2345
+ } else {
2346
+ // 不允许创建新轨道时,限制在现有轨道范围内
2347
+ var _rowOffset = Math.round(preciseOffset);
2348
+ targetRowIndex = Math.max(0, Math.min(_currentRowIndex2 + _rowOffset, editorData.length - 1));
2349
+ }
2021
2350
  }
2022
2351
  // 设置数据
2023
2352
  var sourceRowItem = editorData.find(function (item) {
2024
2353
  return item.id === row.id;
2025
2354
  });
2026
- var targetRowItem = editorData[targetRowIndex];
2355
+ var targetRowItem;
2356
+ // 如果需要创建新轨道
2357
+ if (needCreateNewRow) {
2358
+ var newRowId = "row_".concat(Date.now(), "_").concat(Math.random().toString(36).substr(2, 9));
2359
+ targetRowItem = {
2360
+ id: newRowId,
2361
+ actions: [],
2362
+ rowHeight: rowHeight,
2363
+ type: row.type,
2364
+ classNames: row.classNames,
2365
+ canUpload: row.canUpload // 继承源轨道的canUpload属性
2366
+ };
2367
+ console.log('Creating new row:', newRowId, 'with type:', row.type);
2368
+ // 将新轨道插入到正确的位置
2369
+ if (newRowPosition === 'before') {
2370
+ editorData.unshift(targetRowItem);
2371
+ targetRowIndex = 0;
2372
+ console.log('New row inserted at beginning, index:', targetRowIndex);
2373
+ } else {
2374
+ editorData.push(targetRowItem);
2375
+ targetRowIndex = editorData.length - 1;
2376
+ console.log('New row inserted at end, index:', targetRowIndex);
2377
+ }
2378
+ } else {
2379
+ targetRowItem = editorData[targetRowIndex];
2380
+ console.log('Using existing row:', targetRowItem.id, 'at index:', targetRowIndex);
2381
+ }
2027
2382
  var actionItem = sourceRowItem.actions.find(function (item) {
2028
2383
  return item.id === id;
2029
2384
  });
@@ -2089,7 +2444,15 @@ var EditAction = function EditAction(_ref) {
2089
2444
  var candidateStart = candidateEnd - duration;
2090
2445
  var distance = Math.abs(candidateStart - start);
2091
2446
  console.log('Candidate before first action:', candidateStart, '-', candidateEnd, 'distance:', distance);
2092
- if (distance < minDistance) {
2447
+ if (candidateStart < 0) {
2448
+ return {
2449
+ start: start,
2450
+ end: end,
2451
+ found: false
2452
+ };
2453
+ }
2454
+ // 检查候选位置的 start 是否小于 0
2455
+ if (candidateStart >= 0 && distance < minDistance) {
2093
2456
  minDistance = distance;
2094
2457
  bestPosition = {
2095
2458
  start: candidateStart,
@@ -2163,8 +2526,17 @@ var EditAction = function EditAction(_ref) {
2163
2526
  // 执行碰撞检测和调整
2164
2527
  var adjustmentResult = checkAndAdjustCollision();
2165
2528
  if (!adjustmentResult.found) {
2166
- // 如果找不到合适位置,取消移动
2167
- console.warn('Cannot find suitable position, cancelling move');
2529
+ // 如果找不到合适位置,回到原始位置
2530
+ console.warn('Cannot find suitable position, reverting to original position');
2531
+ // 恢复原始位置的transform
2532
+ var originalTransform = parserTimeToTransform(originalPosition.current, {
2533
+ startLeft: startLeft,
2534
+ scale: scale,
2535
+ scaleWidth: scaleWidth
2536
+ });
2537
+ setTransform(_objectSpread2(_objectSpread2({}, originalTransform), {}, {
2538
+ top: 0
2539
+ }));
2168
2540
  return;
2169
2541
  }
2170
2542
  // 使用调整后的时间
@@ -2176,12 +2548,29 @@ var EditAction = function EditAction(_ref) {
2176
2548
  actionItem.end = end;
2177
2549
  // 如果拖拽到了不同的row,需要移动action
2178
2550
  if (targetRowItem.id !== row.id) {
2551
+ console.log('Moving action to different row');
2552
+ console.log('Source row:', row.id, 'Target row:', targetRowItem.id);
2553
+ console.log('Is new row:', needCreateNewRow);
2554
+ console.log('Target row actions before:', targetRowItem.actions.length);
2179
2555
  // 从原row中移除
2180
2556
  sourceRowItem.actions = sourceRowItem.actions.filter(function (item) {
2181
2557
  return item.id !== id;
2182
2558
  });
2183
2559
  // 添加到目标row
2184
2560
  targetRowItem.actions.push(actionItem);
2561
+ console.log('Target row actions after:', targetRowItem.actions.length);
2562
+ console.log('Action added:', actionItem.id);
2563
+ // 如果源轨道没有action了,删除源轨道
2564
+ if (sourceRowItem.actions.length === 0) {
2565
+ console.log('Source row is empty, removing it:', sourceRowItem.id);
2566
+ var sourceRowIndex = editorData.findIndex(function (item) {
2567
+ return item.id === sourceRowItem.id;
2568
+ });
2569
+ if (sourceRowIndex !== -1) {
2570
+ editorData.splice(sourceRowIndex, 1);
2571
+ console.log('Source row removed at index:', sourceRowIndex);
2572
+ }
2573
+ }
2185
2574
  }
2186
2575
  setEditorData(_toConsumableArray(editorData));
2187
2576
  // 更新transform以反映新位置
@@ -2201,7 +2590,8 @@ var EditAction = function EditAction(_ref) {
2201
2590
  action: actionItem,
2202
2591
  row: targetRowItem,
2203
2592
  start: start,
2204
- end: end
2593
+ end: end,
2594
+ isNewRow: needCreateNewRow
2205
2595
  });
2206
2596
  };
2207
2597
  var handleResizeStart = function handleResizeStart(dir) {
@@ -2290,9 +2680,13 @@ var EditAction = function EditAction(_ref) {
2290
2680
  if (row.actions.includes(action)) {
2291
2681
  nowRow.actions[row.actions.indexOf(action)] = nowAction;
2292
2682
  }
2683
+ var currentRowIndex = editorData.findIndex(function (item) {
2684
+ return item.id === row.id;
2685
+ });
2293
2686
  return /*#__PURE__*/React__default['default'].createElement(RowDnd, {
2294
2687
  ref: rowRnd,
2295
2688
  parentRef: areaRef,
2689
+ verticalScrollRef: containerRef,
2296
2690
  start: startLeft,
2297
2691
  left: transform.left,
2298
2692
  width: transform.width,
@@ -2304,12 +2698,8 @@ var EditAction = function EditAction(_ref) {
2304
2698
  bounds: {
2305
2699
  left: leftLimit,
2306
2700
  right: rightLimit,
2307
- top: -editorData.findIndex(function (item) {
2308
- return item.id === row.id;
2309
- }) * rowHeight,
2310
- bottom: (editorData.length - editorData.findIndex(function (item) {
2311
- return item.id === row.id;
2312
- })) * rowHeight
2701
+ top: -(currentRowIndex + 1) * rowHeight,
2702
+ bottom: (editorData.length - currentRowIndex + 1) * rowHeight
2313
2703
  },
2314
2704
  edges: {
2315
2705
  left: !disableDrag && flexible && ".".concat(prefix('action-left-stretch')),
@@ -2323,7 +2713,8 @@ var EditAction = function EditAction(_ref) {
2323
2713
  onResizeStart: handleResizeStart,
2324
2714
  onResize: handleResizing,
2325
2715
  onResizeEnd: handleResizeEnd,
2326
- deltaScrollLeft: deltaScrollLeft
2716
+ deltaScrollLeft: deltaScrollLeft,
2717
+ deltaScrollTop: handleDeltaScrollTop
2327
2718
  }, /*#__PURE__*/React__default['default'].createElement("div", {
2328
2719
  onMouseDown: function onMouseDown() {
2329
2720
  isDragWhenClick.current = false;
@@ -2373,12 +2764,18 @@ var EditAction = function EditAction(_ref) {
2373
2764
  }
2374
2765
  }, getActionRender && getActionRender(nowAction, nowRow), flexible && /*#__PURE__*/React__default['default'].createElement("div", {
2375
2766
  className: prefix('action-left-stretch')
2376
- }), flexible && /*#__PURE__*/React__default['default'].createElement("div", {
2767
+ }, /*#__PURE__*/React__default['default'].createElement("img", {
2768
+ src: stretchIcon,
2769
+ alt: ""
2770
+ })), flexible && /*#__PURE__*/React__default['default'].createElement("div", {
2377
2771
  className: prefix('action-right-stretch')
2378
- })));
2772
+ }, /*#__PURE__*/React__default['default'].createElement("img", {
2773
+ src: stretchIcon,
2774
+ alt: ""
2775
+ }))));
2379
2776
  };
2380
2777
 
2381
- var css_248z$4 = ".timeline-editor-edit-row {\n background-repeat: no-repeat, repeat;\n display: flex;\n flex-direction: row;\n box-sizing: border-box;\n}\n";
2778
+ var css_248z$4 = ".timeline-editor-edit-row {\n background-repeat: no-repeat, repeat;\n display: flex;\n flex-direction: row;\n box-sizing: border-box;\n}\n.timeline-editor-edit-row.preview-row {\n background-color: rgba(100, 150, 255, 0.15);\n border: 1px dashed rgba(100, 150, 255, 0.5);\n opacity: 0.8;\n transition: all 0.2s ease;\n}\n";
2382
2779
  styleInject(css_248z$4);
2383
2780
 
2384
2781
  var EditRow = function EditRow(props) {
@@ -2392,7 +2789,9 @@ var EditRow = function EditRow(props) {
2392
2789
  scrollLeft = props.scrollLeft,
2393
2790
  startLeft = props.startLeft,
2394
2791
  scale = props.scale,
2395
- scaleWidth = props.scaleWidth;
2792
+ scaleWidth = props.scaleWidth,
2793
+ allowCreateTrack = props.allowCreateTrack,
2794
+ containerRef = props.containerRef;
2396
2795
  var classNames = ['edit-row'];
2397
2796
  if (rowData === null || rowData === void 0 ? void 0 : rowData.selected) classNames.push('edit-row-selected');
2398
2797
  var handleTime = function handleTime(e) {
@@ -2443,7 +2842,10 @@ var EditRow = function EditRow(props) {
2443
2842
  }, props), {}, {
2444
2843
  handleTime: handleTime,
2445
2844
  row: rowData,
2446
- action: action
2845
+ action: action,
2846
+ allowCreateTrack: allowCreateTrack,
2847
+ setDropPreview: props.setDropPreview,
2848
+ containerRef: containerRef
2447
2849
  }));
2448
2850
  }));
2449
2851
  };
@@ -2554,6 +2956,22 @@ function useDragLine() {
2554
2956
  };
2555
2957
  }
2556
2958
 
2959
+ // 获取音频时长
2960
+ var getAudioDuration = function getAudioDuration(url) {
2961
+ return new Promise(function (resolve) {
2962
+ var sound = new howler.Howl({
2963
+ src: [url]
2964
+ });
2965
+ sound.on('load', function () {
2966
+ resolve(sound.duration());
2967
+ sound.unload();
2968
+ });
2969
+ sound.on('loaderror', function () {
2970
+ resolve(2); // 加载失败时返回默认时长2秒
2971
+ sound.unload();
2972
+ });
2973
+ });
2974
+ };
2557
2975
  var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props, ref) {
2558
2976
  var className = props.className,
2559
2977
  _props$isMulti = props.isMulti,
@@ -2576,7 +2994,61 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2576
2994
  _onActionMoving = props.onActionMoving,
2577
2995
  _onActionResizeEnd = props.onActionResizeEnd,
2578
2996
  _onActionResizeStart = props.onActionResizeStart,
2579
- _onActionResizing = props.onActionResizing;
2997
+ _onActionResizing = props.onActionResizing,
2998
+ onUpdateEditorData = props.onUpdateEditorData,
2999
+ _props$canUpload = props.canUpload,
3000
+ canUpload = _props$canUpload === void 0 ? false : _props$canUpload,
3001
+ customRequest = props.customRequest,
3002
+ setEditorData = props.setEditorData,
3003
+ _props$allowCreateTra = props.allowCreateTrack,
3004
+ allowCreateTrack = _props$allowCreateTra === void 0 ? true : _props$allowCreateTra,
3005
+ containerRef = props.containerRef;
3006
+ // 支持mp3\wav格式上传
3007
+ var onBeforeUpload = function onBeforeUpload(file) {
3008
+ if (file.type !== 'audio/mp3' && file.type !== 'audio/wav') {
3009
+ es.message.error('只能上传mp3wav格式的音频');
3010
+ return false;
3011
+ }
3012
+ return true;
3013
+ };
3014
+ var handleUploadChange = function handleUploadChange(row) {
3015
+ return /*#__PURE__*/function () {
3016
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(info) {
3017
+ var uid, duration, newAction;
3018
+ return _regenerator().w(function (_context) {
3019
+ while (1) switch (_context.n) {
3020
+ case 0:
3021
+ console.log('Upload info:', info);
3022
+ if (!(!info.file || !info.file.response)) {
3023
+ _context.n = 1;
3024
+ break;
3025
+ }
3026
+ return _context.a(2);
3027
+ case 1:
3028
+ uid = info.file.uid;
3029
+ _context.n = 2;
3030
+ return getAudioDuration(info.file.response.url);
3031
+ case 2:
3032
+ duration = _context.v;
3033
+ newAction = {
3034
+ id: uid,
3035
+ effectId: 'custom_video_effect',
3036
+ flexible: true,
3037
+ url: info.file.response.url,
3038
+ start: currentMouseTime,
3039
+ end: currentMouseTime + duration
3040
+ };
3041
+ onUpdateEditorData === null || onUpdateEditorData === void 0 ? void 0 : onUpdateEditorData(row, [newAction]);
3042
+ case 3:
3043
+ return _context.a(2);
3044
+ }
3045
+ }, _callee);
3046
+ }));
3047
+ return function (_x) {
3048
+ return _ref.apply(this, arguments);
3049
+ };
3050
+ }();
3051
+ };
2580
3052
  var _useDragLine = useDragLine(),
2581
3053
  dragLineData = _useDragLine.dragLineData,
2582
3054
  initDragLine = _useDragLine.initDragLine,
@@ -2586,7 +3058,33 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2586
3058
  defaultGetMovePosition = _useDragLine.defaultGetMovePosition;
2587
3059
  var editAreaRef = React.useRef();
2588
3060
  var gridRef = React.useRef();
3061
+ var _useState = React.useState(0),
3062
+ _useState2 = _slicedToArray(_useState, 2),
3063
+ currentMouseTime = _useState2[0],
3064
+ setCurrentMouseTime = _useState2[1];
2589
3065
  var heightRef = React.useRef(-1);
3066
+ var uploadRef = React.useRef();
3067
+ var _useState3 = React.useState(null),
3068
+ _useState4 = _slicedToArray(_useState3, 2),
3069
+ dropPreview = _useState4[0],
3070
+ setDropPreview = _useState4[1];
3071
+ // 处理拖拽上传事件
3072
+ var handleDrop = function handleDrop(e) {
3073
+ e.preventDefault();
3074
+ e.stopPropagation();
3075
+ // 计算鼠标所在位置的时间
3076
+ if (!editAreaRef.current) return;
3077
+ var rect = editAreaRef.current.getBoundingClientRect();
3078
+ var position = e.clientX - rect.x;
3079
+ var left = position + scrollLeft;
3080
+ var time = parserPixelToTime(left, {
3081
+ startLeft: startLeft,
3082
+ scale: scale,
3083
+ scaleWidth: scaleWidth
3084
+ });
3085
+ setCurrentMouseTime(time);
3086
+ console.log('拖拽上传位置的时间:', time);
3087
+ };
2590
3088
  // ref 数据
2591
3089
  React.useImperativeHandle(ref, function () {
2592
3090
  return {
@@ -2636,12 +3134,12 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2636
3134
  }
2637
3135
  };
2638
3136
  /** 获取每个cell渲染内容 */
2639
- var cellRenderer = function cellRenderer(_ref) {
2640
- var rowIndex = _ref.rowIndex,
2641
- key = _ref.key,
2642
- style = _ref.style;
3137
+ var cellRenderer = function cellRenderer(_ref2) {
3138
+ var rowIndex = _ref2.rowIndex,
3139
+ key = _ref2.key,
3140
+ style = _ref2.style;
2643
3141
  var row = editorData[rowIndex]; // 行数据
2644
- return /*#__PURE__*/React__default['default'].createElement(EditRow, _objectSpread2(_objectSpread2({}, props), {}, {
3142
+ var editRow = /*#__PURE__*/React__default['default'].createElement(EditRow, _objectSpread2(_objectSpread2({}, props), {}, {
2645
3143
  style: _objectSpread2(_objectSpread2({}, style), {}, {
2646
3144
  backgroundPositionX: "0, ".concat(startLeft, "px"),
2647
3145
  backgroundSize: "".concat(startLeft, "px, ").concat(scaleWidth, "px")
@@ -2651,6 +3149,9 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2651
3149
  rowHeight: (row === null || row === void 0 ? void 0 : row.rowHeight) || _rowHeight,
2652
3150
  rowData: row,
2653
3151
  dragLineData: dragLineData,
3152
+ allowCreateTrack: allowCreateTrack,
3153
+ setDropPreview: setDropPreview,
3154
+ containerRef: containerRef,
2654
3155
  onActionMoveStart: function onActionMoveStart(data) {
2655
3156
  handleInitDragLine(data);
2656
3157
  return _onActionMoveStart && _onActionMoveStart(data);
@@ -2676,6 +3177,26 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2676
3177
  return _onActionMoveEnd && _onActionMoveEnd(data);
2677
3178
  }
2678
3179
  }));
3180
+ if (canUpload || (row === null || row === void 0 ? void 0 : row.canUpload)) {
3181
+ return /*#__PURE__*/React__default['default'].createElement(es.Upload, {
3182
+ ref: uploadRef,
3183
+ key: key,
3184
+ style: _objectSpread2(_objectSpread2({
3185
+ width: '100%',
3186
+ display: 'block'
3187
+ }, style), {}, {
3188
+ top: 0
3189
+ }),
3190
+ beforeUpload: onBeforeUpload,
3191
+ onChange: handleUploadChange(row),
3192
+ showUploadList: false,
3193
+ openFileDialogOnClick: false,
3194
+ customRequest: customRequest,
3195
+ onDrop: handleDrop,
3196
+ type: "drag"
3197
+ }, editRow);
3198
+ }
3199
+ return editRow;
2679
3200
  };
2680
3201
  React.useLayoutEffect(function () {
2681
3202
  var _gridRef$current;
@@ -2689,7 +3210,7 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2689
3210
  }, [editorData]);
2690
3211
  var _totalHeight = editorData.reduce(function (prev, cur) {
2691
3212
  return prev + (cur.rowHeight || _rowHeight);
2692
- }, 0) + 32;
3213
+ }, 0) + ((className || '').indexOf('1') > -1 ? 12 : 32);
2693
3214
  return /*#__PURE__*/React__default['default'].createElement("div", {
2694
3215
  ref: editAreaRef,
2695
3216
  className: prefix('edit-area') + " ".concat((className || '').replace('timeline-editor', '') || ''),
@@ -2701,9 +3222,9 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2701
3222
  style: {
2702
3223
  height: isMulti ? _totalHeight : 'unset'
2703
3224
  }
2704
- }, function (_ref2) {
2705
- var width = _ref2.width,
2706
- height = _ref2.height;
3225
+ }, function (_ref3) {
3226
+ var width = _ref3.width,
3227
+ height = _ref3.height;
2707
3228
  // 获取全部高度
2708
3229
  var totalHeight = 0;
2709
3230
  // 高度列表
@@ -2732,26 +3253,50 @@ var EditArea = /*#__PURE__*/React__default['default'].forwardRef(function (props
2732
3253
  columnWidth: Math.max(scaleCount * scaleWidth + startLeft, width),
2733
3254
  width: width,
2734
3255
  height: height,
2735
- rowHeight: function rowHeight(_ref3) {
2736
- var index = _ref3.index;
3256
+ rowHeight: function rowHeight(_ref4) {
3257
+ var index = _ref4.index;
2737
3258
  return heights[index] || _rowHeight;
2738
3259
  },
2739
3260
  overscanRowCount: 10,
2740
3261
  overscanColumnCount: 0,
2741
3262
  onScroll: function onScroll(param) {
2742
- console.log(param, 'onScroll');
2743
3263
  _onScroll(param);
2744
3264
  }
2745
3265
  });
2746
3266
  }), dragLine && /*#__PURE__*/React__default['default'].createElement(DragLines, _objectSpread2({
2747
3267
  scrollLeft: scrollLeft
2748
- }, dragLineData)));
3268
+ }, dragLineData)), dropPreview && function () {
3269
+ // 计算预览指示器的位置
3270
+ var top = 0;
3271
+ for (var i = 0; i < editorData.length; i++) {
3272
+ if (dropPreview.position === 'before' && i === dropPreview.rowIndex) {
3273
+ break;
3274
+ }
3275
+ top += editorData[i].rowHeight || _rowHeight;
3276
+ if (dropPreview.position === 'after' && i === dropPreview.rowIndex) {
3277
+ break;
3278
+ }
3279
+ }
3280
+ return /*#__PURE__*/React__default['default'].createElement("div", {
3281
+ style: {
3282
+ position: 'absolute',
3283
+ left: 0,
3284
+ right: 0,
3285
+ top: top - scrollTop,
3286
+ height: '2px',
3287
+ backgroundColor: 'transparent',
3288
+ borderTop: '2px dashed #1890ff',
3289
+ zIndex: 1000,
3290
+ pointerEvents: 'none'
3291
+ }
3292
+ });
3293
+ }());
2749
3294
  });
2750
3295
 
2751
3296
  var css_248z$5 = ".timeline-editor {\n height: 600px;\n width: 600px;\n min-height: 32px;\n position: relative;\n font-size: 12px;\n font-family: \"PingFang SC\";\n background-color: #191b1d;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.timeline-editor.light {\n background-color: #fff;\n}\n";
2752
3297
  styleInject(css_248z$5);
2753
3298
 
2754
- var css_248z$6 = ".timeline-editor-time-area {\n position: relative;\n height: 32px;\n flex: 0 0 auto;\n}\n.timeline-editor-time-area .ReactVirtualized__Grid {\n outline: none;\n}\n.timeline-editor-time-area .ReactVirtualized__Grid::-webkit-scrollbar {\n display: none;\n}\n.timeline-editor-time-area-interact {\n position: absolute;\n cursor: pointer;\n left: 0;\n top: 0;\n}\n.timeline-editor-time-unit {\n border-right: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n box-sizing: content-box;\n height: 4px !important;\n bottom: 0 !important;\n top: auto !important;\n}\n.timeline-editor-time-unit-big {\n height: 8px !important;\n}\n.timeline-editor-time-unit-scale {\n color: rgba(255, 255, 255, 0.6);\n position: absolute;\n right: 0;\n top: 0;\n transform: translate(50%, -100%);\n}\n.light.timeline-editor .timeline-editor-time-unit {\n border-color: #666;\n}\n.light.timeline-editor .timeline-editor-time-unit-scale {\n color: #111;\n}\n";
3299
+ var css_248z$6 = ".timeline-editor-time-area {\n position: relative;\n height: 32px;\n flex: 0 0 auto;\n}\n.timeline-editor-time-area .ReactVirtualized__Grid {\n outline: none;\n}\n.timeline-editor-time-area .ReactVirtualized__Grid::-webkit-scrollbar {\n display: none;\n}\n.timeline-editor-time-area-interact {\n position: absolute;\n cursor: pointer;\n left: 0;\n top: 0;\n}\n.timeline-editor-time-unit {\n border-right: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n box-sizing: content-box;\n height: 4px !important;\n bottom: 0 !important;\n top: auto !important;\n}\n.timeline-editor-time-unit-big {\n height: 8px !important;\n}\n.timeline-editor-time-unit-scale {\n color: rgba(255, 255, 255, 0.6);\n position: absolute;\n right: 0;\n top: 0;\n transform: translate(50%, -100%);\n}\n.light.timeline-editor .timeline-editor-time-unit {\n border-color: #111;\n}\n.light.timeline-editor .timeline-editor-time-unit-scale {\n color: #666;\n}\n";
2755
3300
  styleInject(css_248z$6);
2756
3301
 
2757
3302
  /** 动画时间轴组件 */
@@ -2868,11 +3413,14 @@ var Timeline = /*#__PURE__*/React__default['default'].forwardRef(function (props
2868
3413
  engine = checkedProps.engine,
2869
3414
  _checkedProps$autoReR = checkedProps.autoReRender,
2870
3415
  autoReRender = _checkedProps$autoReR === void 0 ? true : _checkedProps$autoReR,
2871
- onScrollVertical = checkedProps.onScroll;
3416
+ onScrollVertical = checkedProps.onScroll,
3417
+ _checkedProps$allowCr = checkedProps.allowCreateTrack,
3418
+ allowCreateTrack = _checkedProps$allowCr === void 0 ? true : _checkedProps$allowCr;
2872
3419
  var engineRef = React.useRef(engine || new TimelineEngine());
2873
3420
  var domRef = React.useRef();
2874
3421
  var areaRef = React.useRef();
2875
3422
  var scrollSync = React.useRef();
3423
+ var containerRef = React.useRef();
2876
3424
  // 编辑器数据
2877
3425
  var _useState = React.useState(data),
2878
3426
  _useState2 = _slicedToArray(_useState, 2),
@@ -3079,11 +3627,18 @@ var Timeline = /*#__PURE__*/React__default['default'].forwardRef(function (props
3079
3627
  scrollLeft: scrollLeft,
3080
3628
  setEditorData: handleEditorDataChange,
3081
3629
  deltaScrollLeft: autoScroll && handleDeltaScrollLeft,
3630
+ allowCreateTrack: allowCreateTrack,
3082
3631
  onScroll: function onScroll(params) {
3083
3632
  _onScroll(params);
3084
3633
  onScrollVertical && onScrollVertical(params);
3085
3634
  }
3086
- }))) : null, areaCount > 1 ? Object.keys(groupedData).map(function (key, index) {
3635
+ }))) : null, areaCount > 1 ? /*#__PURE__*/React__default['default'].createElement("div", {
3636
+ id: 'time-editor-container',
3637
+ ref: containerRef,
3638
+ style: {
3639
+ overflow: 'auto'
3640
+ }
3641
+ }, Object.keys(groupedData).map(function (key, index) {
3087
3642
  var handleGroupDataChange = function handleGroupDataChange(updatedData) {
3088
3643
  var mergedData = editorData.filter(function (item) {
3089
3644
  return String(item.type) !== key;
@@ -3102,9 +3657,9 @@ var Timeline = /*#__PURE__*/React__default['default'].forwardRef(function (props
3102
3657
  };
3103
3658
  return /*#__PURE__*/React__default['default'].createElement(EditArea, _objectSpread2(_objectSpread2({
3104
3659
  key: key,
3105
- isMulti: areaCount > 1,
3106
- className: index !== 0 ? "no-flex ".concat(key, " ").concat(index) : "overflow-hidden ".concat(key, " ").concat(index)
3660
+ isMulti: areaCount > 1
3107
3661
  }, checkedProps), {}, {
3662
+ className: index !== 0 ? "no-flex ".concat(key, " ").concat(index) : "overflow-hidden ".concat(key, " ").concat(index),
3108
3663
  timelineWidth: width,
3109
3664
  ref: function ref(_ref4) {
3110
3665
  return areaRef.current = _ref4 === null || _ref4 === void 0 ? void 0 : _ref4.domRef.current;
@@ -3118,12 +3673,14 @@ var Timeline = /*#__PURE__*/React__default['default'].forwardRef(function (props
3118
3673
  scrollLeft: scrollLeft,
3119
3674
  setEditorData: handleGroupDataChange,
3120
3675
  deltaScrollLeft: autoScroll && handleDeltaScrollLeft,
3676
+ allowCreateTrack: allowCreateTrack,
3677
+ containerRef: containerRef,
3121
3678
  onScroll: function onScroll(params) {
3122
3679
  _onScroll(params);
3123
3680
  onScrollVertical && onScrollVertical(params);
3124
3681
  }
3125
3682
  }));
3126
- }) : null, !hideCursor && (/*#__PURE__*/React__default['default'].createElement(Cursor, _objectSpread2(_objectSpread2({}, checkedProps), {}, {
3683
+ })) : null, !hideCursor && (/*#__PURE__*/React__default['default'].createElement(Cursor, _objectSpread2(_objectSpread2({}, checkedProps), {}, {
3127
3684
  timelineWidth: width,
3128
3685
  disableDrag: isPlaying,
3129
3686
  scrollLeft: scrollLeft,