canvas2d-wrapper 1.3.4 → 1.5.0

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.
@@ -1,15 +1,28 @@
1
- import React, { useState, useCallback } from 'react';
1
+ import React, { useState, useCallback, useEffect } from 'react';
2
2
 
3
+ function _toPrimitive(t, r) {
4
+ if ("object" != typeof t || !t) return t;
5
+ var e = t[Symbol.toPrimitive];
6
+ if (void 0 !== e) {
7
+ var i = e.call(t, r || "default");
8
+ if ("object" != typeof i) return i;
9
+ throw new TypeError("@@toPrimitive must return a primitive value.");
10
+ }
11
+ return ("string" === r ? String : Number)(t);
12
+ }
13
+ function _toPropertyKey(t) {
14
+ var i = _toPrimitive(t, "string");
15
+ return "symbol" == typeof i ? i : String(i);
16
+ }
3
17
  function _defineProperties(target, props) {
4
18
  for (var i = 0; i < props.length; i++) {
5
19
  var descriptor = props[i];
6
20
  descriptor.enumerable = descriptor.enumerable || false;
7
21
  descriptor.configurable = true;
8
22
  if ("value" in descriptor) descriptor.writable = true;
9
- Object.defineProperty(target, descriptor.key, descriptor);
23
+ Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
10
24
  }
11
25
  }
12
-
13
26
  function _createClass(Constructor, protoProps, staticProps) {
14
27
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
15
28
  if (staticProps) _defineProperties(Constructor, staticProps);
@@ -18,56 +31,44 @@ function _createClass(Constructor, protoProps, staticProps) {
18
31
  });
19
32
  return Constructor;
20
33
  }
21
-
22
34
  function _extends() {
23
- _extends = Object.assign || function (target) {
35
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
24
36
  for (var i = 1; i < arguments.length; i++) {
25
37
  var source = arguments[i];
26
-
27
38
  for (var key in source) {
28
39
  if (Object.prototype.hasOwnProperty.call(source, key)) {
29
40
  target[key] = source[key];
30
41
  }
31
42
  }
32
43
  }
33
-
34
44
  return target;
35
45
  };
36
-
37
46
  return _extends.apply(this, arguments);
38
47
  }
39
-
40
48
  function _inheritsLoose(subClass, superClass) {
41
49
  subClass.prototype = Object.create(superClass.prototype);
42
50
  subClass.prototype.constructor = subClass;
43
-
44
51
  _setPrototypeOf(subClass, superClass);
45
52
  }
46
-
47
53
  function _setPrototypeOf(o, p) {
48
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
54
+ _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
49
55
  o.__proto__ = p;
50
56
  return o;
51
57
  };
52
-
53
58
  return _setPrototypeOf(o, p);
54
59
  }
55
-
56
60
  function _objectWithoutPropertiesLoose(source, excluded) {
57
61
  if (source == null) return {};
58
62
  var target = {};
59
63
  var sourceKeys = Object.keys(source);
60
64
  var key, i;
61
-
62
65
  for (i = 0; i < sourceKeys.length; i++) {
63
66
  key = sourceKeys[i];
64
67
  if (excluded.indexOf(key) >= 0) continue;
65
68
  target[key] = source[key];
66
69
  }
67
-
68
70
  return target;
69
71
  }
70
-
71
72
  function _unsupportedIterableToArray(o, minLen) {
72
73
  if (!o) return;
73
74
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
@@ -76,19 +77,14 @@ function _unsupportedIterableToArray(o, minLen) {
76
77
  if (n === "Map" || n === "Set") return Array.from(o);
77
78
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
78
79
  }
79
-
80
80
  function _arrayLikeToArray(arr, len) {
81
81
  if (len == null || len > arr.length) len = arr.length;
82
-
83
82
  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
84
-
85
83
  return arr2;
86
84
  }
87
-
88
85
  function _createForOfIteratorHelperLoose(o, allowArrayLike) {
89
86
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
90
87
  if (it) return (it = it.call(o)).next.bind(it);
91
-
92
88
  if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
93
89
  if (it) o = it;
94
90
  var i = 0;
@@ -102,7 +98,6 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
102
98
  };
103
99
  };
104
100
  }
105
-
106
101
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
107
102
  }
108
103
 
@@ -118,31 +113,24 @@ function inCircle(element, x, y, left, top, localTileSize) {
118
113
  function inPoly(element, x, y, mouseX, mouseY, localTileSize) {
119
114
  var j = element.points.length - 1;
120
115
  var counter = false;
121
-
122
116
  for (var i = 0; i < element.points.length; i++) {
123
117
  var iX = element.points[i].x * localTileSize;
124
118
  var iY = element.points[i].y * localTileSize;
125
-
126
119
  if (mouseX === iX && mouseY === iY) {
127
120
  return true;
128
121
  }
129
-
130
122
  var jX = element.points[j].x * localTileSize;
131
123
  var jY = element.points[j].y * localTileSize;
132
-
133
124
  if (iY > y !== jY > y) {
134
125
  var slope = (mouseX - iX) * (jY - iY) - (jX - iX) * (mouseY - iY);
135
-
136
126
  if (slope === 0) {
137
127
  return true;
138
128
  }
139
-
140
129
  if (slope < 0 !== jY < iY) {
141
130
  counter = !counter;
142
131
  }
143
132
  }
144
133
  }
145
-
146
134
  return counter;
147
135
  }
148
136
 
@@ -154,12 +142,10 @@ function inRect(element, x, y, left, top, localTileSize) {
154
142
 
155
143
  function collideElement(e, elements, left, top, tileSize, zoom) {
156
144
  var localTileSize = calcTileSize(tileSize, zoom);
157
-
158
145
  for (var _iterator = _createForOfIteratorHelperLoose(elements), _step; !(_step = _iterator()).done;) {
159
146
  var element = _step.value;
160
147
  var x = element.x * localTileSize;
161
148
  var y = element.y * localTileSize;
162
-
163
149
  switch (element.constructorName) {
164
150
  case 'Rect':
165
151
  case 'CanvasImage':
@@ -170,9 +156,7 @@ function collideElement(e, elements, left, top, tileSize, zoom) {
170
156
  originalEvent: e
171
157
  };
172
158
  }
173
-
174
159
  break;
175
-
176
160
  case 'Circle':
177
161
  if (inCircle(element, x, y, left, top, localTileSize)) {
178
162
  return {
@@ -181,9 +165,7 @@ function collideElement(e, elements, left, top, tileSize, zoom) {
181
165
  originalEvent: e
182
166
  };
183
167
  }
184
-
185
168
  break;
186
-
187
169
  case 'Polygon':
188
170
  if (inPoly(element, x, y, left, top, localTileSize)) {
189
171
  return {
@@ -192,11 +174,9 @@ function collideElement(e, elements, left, top, tileSize, zoom) {
192
174
  originalEvent: e
193
175
  };
194
176
  }
195
-
196
177
  break;
197
178
  }
198
179
  }
199
-
200
180
  return null;
201
181
  }
202
182
 
@@ -204,11 +184,9 @@ function elementClick(e, elements, tileSize, state) {
204
184
  var left = -state.left - state.deltaLeft + e.pageX - e.target.offsetLeft;
205
185
  var top = -state.top - state.deltaTop + e.pageY - e.target.offsetTop;
206
186
  var clickedElement = collideElement(e, elements, left, top, tileSize, state.zoom);
207
-
208
187
  if (clickedElement !== null) {
209
188
  return clickedElement;
210
189
  }
211
-
212
190
  return {
213
191
  id: null,
214
192
  element: null,
@@ -220,11 +198,9 @@ function elementRightClick(e, elements, tileSize, state) {
220
198
  var left = -state.left - state.deltaLeft + e.pageX - e.target.offsetLeft;
221
199
  var top = -state.top - state.deltaTop + e.pageY - e.target.offsetTop;
222
200
  var clickedElement = collideElement(e, elements, left, top, tileSize, state.zoom);
223
-
224
201
  if (clickedElement !== null) {
225
202
  return clickedElement;
226
203
  }
227
-
228
204
  return {
229
205
  id: null,
230
206
  element: null,
@@ -234,67 +210,67 @@ function elementRightClick(e, elements, tileSize, state) {
234
210
 
235
211
  var LEFT_BUTTON = 1;
236
212
  var selectedObject = null;
213
+ var unselectTimeoutId = 0;
214
+ var UNSELECT_TIMEOUT_MS = 300;
237
215
  function mouseMove(event, elements, tileSize, props, setProps, lockXAxis, lockYAxis, dragObjects, onElementMoved, onHover) {
238
216
  var newProps = _extends({}, props);
239
-
240
217
  var left = -props.left - props.deltaLeft + event.pageX - event.target.offsetLeft;
241
218
  var top = -props.top - props.deltaTop + event.pageY - event.target.offsetTop;
242
-
243
219
  if (event.nativeEvent.buttons === LEFT_BUTTON && !!props.prevX) {
244
220
  var moved = false;
245
-
246
221
  if (dragObjects) {
247
222
  if (selectedObject === null) {
248
223
  selectedObject = collideElement(event, elements, left, top, tileSize, props.zoom);
249
224
  }
250
-
251
225
  if (selectedObject !== null && selectedObject.element.draggable) {
252
226
  selectedObject.element.x = -props.left - props.deltaLeft + (event.clientX - props.boundingClientRect.left) - selectedObject.element.width / 2;
253
227
  selectedObject.element.y = -props.top - props.deltaLeft + (event.clientY - props.boundingClientRect.top) - selectedObject.element.height / 2;
254
228
  moved = true;
255
-
256
229
  if (onElementMoved) {
257
230
  onElementMoved(selectedObject, event.screenX - props.prevX, event.screenY - props.prevY);
258
231
  }
259
-
260
232
  if (onHover) {
261
233
  onHover(null);
262
234
  }
263
235
  }
264
236
  }
265
-
266
237
  if (!moved) {
267
238
  if (!lockXAxis) {
268
239
  newProps.left += event.screenX - props.prevX;
269
240
  }
270
-
271
241
  if (!lockYAxis) {
272
242
  newProps.top += event.screenY - props.prevY;
273
243
  }
274
244
  }
245
+ if (event.nativeEvent.pointerType !== 'mouse') {
246
+ unselectTimeoutId = setTimeout(function () {
247
+ selectedObject = null;
248
+ setProps(_extends({}, newProps, {
249
+ prevX: null,
250
+ prevY: null
251
+ }));
252
+ }, UNSELECT_TIMEOUT_MS);
253
+ }
275
254
  } else {
276
255
  if (onHover) {
277
256
  onHover(collideElement(event, elements, left, top, tileSize, props.zoom));
278
257
  }
279
-
280
258
  selectedObject = null;
281
259
  }
282
-
283
260
  setProps(_extends({}, newProps, {
284
261
  prevX: event.screenX,
285
262
  prevY: event.screenY
286
263
  }));
287
264
  }
288
265
 
266
+ var WHEEL_DELTA = 0.05;
289
267
  function mouseWheel(event, props, setProps, minZoom, maxZoom) {
290
268
  var zoom = props.zoom;
291
-
292
269
  if (event.deltaY < 0) {
293
- zoom += 0.05;
270
+ zoom += WHEEL_DELTA;
294
271
  } else {
295
- zoom -= 0.05;
272
+ zoom -= WHEEL_DELTA;
296
273
  }
297
-
298
274
  zoom = Math.max(zoom, minZoom);
299
275
  zoom = Math.min(zoom, maxZoom);
300
276
  setProps(_extends({}, props, {
@@ -307,23 +283,18 @@ function sortElements(elements) {
307
283
  if (a.zIndex !== b.zIndex) {
308
284
  return a.zIndex - b.zIndex;
309
285
  }
310
-
311
286
  if (a.fill === b.fill) {
312
287
  if (a.stroke === b.stroke) {
313
288
  return 0;
314
289
  }
315
-
316
290
  if (a.stroke < b.stroke) {
317
291
  return 1;
318
292
  }
319
-
320
293
  return -1;
321
294
  }
322
-
323
295
  if (a.fill < b.fill) {
324
296
  return 1;
325
297
  }
326
-
327
298
  return -1;
328
299
  });
329
300
  return elements;
@@ -337,7 +308,6 @@ var CanvasObject = /*#__PURE__*/function () {
337
308
  this['z-index'] = zIndex;
338
309
  this.draggable = draggable;
339
310
  }
340
-
341
311
  _createClass(CanvasObject, [{
342
312
  key: "zIndex",
343
313
  get: function get() {
@@ -352,167 +322,142 @@ var CanvasObject = /*#__PURE__*/function () {
352
322
  return 'CanvasObject';
353
323
  }
354
324
  }]);
355
-
356
325
  return CanvasObject;
357
326
  }();
358
327
 
359
328
  var ColoredCanvasObject = /*#__PURE__*/function (_CanvasObject) {
360
329
  _inheritsLoose(ColoredCanvasObject, _CanvasObject);
361
-
362
330
  function ColoredCanvasObject(id, x, y, fill, stroke, zIndex, draggable) {
363
331
  var _this;
364
-
365
332
  _this = _CanvasObject.call(this, id, x, y, zIndex, draggable) || this;
366
333
  _this.fill = fill;
367
334
  _this.stroke = stroke;
368
335
  return _this;
369
336
  }
370
-
371
337
  _createClass(ColoredCanvasObject, [{
372
338
  key: "constructorName",
373
339
  get: function get() {
374
340
  return 'ColoredCanvasObject';
375
341
  }
376
342
  }]);
377
-
378
343
  return ColoredCanvasObject;
379
344
  }(CanvasObject);
380
345
 
381
346
  var Circle = /*#__PURE__*/function (_ColoredCanvasObject) {
382
347
  _inheritsLoose(Circle, _ColoredCanvasObject);
383
-
384
348
  function Circle(_ref) {
385
349
  var _this;
386
-
387
350
  var id = _ref.id,
388
- x = _ref.x,
389
- y = _ref.y,
390
- radius = _ref.radius,
391
- fill = _ref.fill,
392
- stroke = _ref.stroke,
393
- zIndex = _ref.zIndex,
394
- draggable = _ref.draggable;
351
+ x = _ref.x,
352
+ y = _ref.y,
353
+ radius = _ref.radius,
354
+ fill = _ref.fill,
355
+ stroke = _ref.stroke,
356
+ zIndex = _ref.zIndex,
357
+ draggable = _ref.draggable;
395
358
  _this = _ColoredCanvasObject.call(this, id, x, y, fill, stroke, zIndex, draggable) || this;
396
359
  _this.radius = radius;
397
360
  return _this;
398
361
  }
399
-
400
362
  _createClass(Circle, [{
401
363
  key: "constructorName",
402
364
  get: function get() {
403
365
  return 'Circle';
404
366
  }
405
367
  }]);
406
-
407
368
  return Circle;
408
369
  }(ColoredCanvasObject);
409
370
 
410
371
  var CanvasImage = /*#__PURE__*/function (_CanvasObject) {
411
372
  _inheritsLoose(CanvasImage, _CanvasObject);
412
-
413
373
  function CanvasImage(_ref) {
414
374
  var _this;
415
-
416
375
  var id = _ref.id,
417
- x = _ref.x,
418
- y = _ref.y,
419
- width = _ref.width,
420
- height = _ref.height,
421
- src = _ref.src,
422
- zIndex = _ref.zIndex,
423
- draggable = _ref.draggable;
376
+ x = _ref.x,
377
+ y = _ref.y,
378
+ width = _ref.width,
379
+ height = _ref.height,
380
+ src = _ref.src,
381
+ zIndex = _ref.zIndex,
382
+ draggable = _ref.draggable;
424
383
  _this = _CanvasObject.call(this, id, x, y, zIndex, draggable) || this;
425
384
  _this.width = width;
426
385
  _this.height = height;
427
386
  _this.src = src;
428
387
  return _this;
429
388
  }
430
-
431
389
  var _proto = CanvasImage.prototype;
432
-
433
390
  _proto.crop = function crop(x, y, width, height) {
434
391
  this.sx = sx;
435
392
  this.sy = sx;
436
393
  this.swidth = swidth;
437
394
  this.sheight = sheight;
438
395
  };
439
-
440
396
  _createClass(CanvasImage, [{
441
397
  key: "constructorName",
442
398
  get: function get() {
443
399
  return 'CanvasImage';
444
400
  }
445
401
  }]);
446
-
447
402
  return CanvasImage;
448
403
  }(CanvasObject);
449
404
 
450
405
  var Rect = /*#__PURE__*/function (_ColoredCanvasObject) {
451
406
  _inheritsLoose(Rect, _ColoredCanvasObject);
452
-
453
407
  function Rect(_ref) {
454
408
  var _this;
455
-
456
409
  var id = _ref.id,
457
- x = _ref.x,
458
- y = _ref.y,
459
- width = _ref.width,
460
- height = _ref.height,
461
- fill = _ref.fill,
462
- stroke = _ref.stroke,
463
- zIndex = _ref.zIndex,
464
- draggable = _ref.draggable;
410
+ x = _ref.x,
411
+ y = _ref.y,
412
+ width = _ref.width,
413
+ height = _ref.height,
414
+ fill = _ref.fill,
415
+ stroke = _ref.stroke,
416
+ zIndex = _ref.zIndex,
417
+ draggable = _ref.draggable;
465
418
  _this = _ColoredCanvasObject.call(this, id, x, y, fill, stroke, zIndex, draggable) || this;
466
419
  _this.width = width;
467
420
  _this.height = height;
468
421
  return _this;
469
422
  }
470
-
471
423
  _createClass(Rect, [{
472
424
  key: "constructorName",
473
425
  get: function get() {
474
426
  return 'Rect';
475
427
  }
476
428
  }]);
477
-
478
429
  return Rect;
479
430
  }(ColoredCanvasObject);
480
431
 
481
432
  var Polygon = /*#__PURE__*/function (_ColoredCanvasObject) {
482
433
  _inheritsLoose(Polygon, _ColoredCanvasObject);
483
-
484
434
  function Polygon(_ref) {
485
435
  var _this;
486
-
487
436
  var id = _ref.id,
488
- points = _ref.points,
489
- fill = _ref.fill,
490
- stroke = _ref.stroke,
491
- zIndex = _ref.zIndex,
492
- draggable = _ref.draggable;
437
+ points = _ref.points,
438
+ fill = _ref.fill,
439
+ stroke = _ref.stroke,
440
+ zIndex = _ref.zIndex,
441
+ draggable = _ref.draggable;
493
442
  _this = _ColoredCanvasObject.call(this, id, points[0].x, points[0].y, fill, stroke, zIndex, draggable) || this;
494
443
  _this.points = points;
495
444
  return _this;
496
445
  }
497
-
498
446
  _createClass(Polygon, [{
499
447
  key: "constructorName",
500
448
  get: function get() {
501
449
  return 'Polygon';
502
450
  }
503
451
  }]);
504
-
505
452
  return Polygon;
506
453
  }(ColoredCanvasObject);
507
454
 
508
455
  function renderCircle(context, element, left, top, localTileSize) {
509
456
  context.beginPath();
510
457
  context.arc(left + element.x * localTileSize, top + element.y * localTileSize, element.radius * localTileSize, 0, 2 * Math.PI);
511
-
512
458
  if (element.fill) {
513
459
  context.fill();
514
460
  }
515
-
516
461
  if (element.stroke) {
517
462
  context.stroke();
518
463
  }
@@ -525,7 +470,6 @@ function renderImage(context, element, left, top, localTileSize) {
525
470
  __canvas2dWrapper__.imgCache[element.src] = new Image();
526
471
  __canvas2dWrapper__.imgCache[element.src].src = element.src;
527
472
  }
528
-
529
473
  if (!element.sx) {
530
474
  context.drawImage(__canvas2dWrapper__.imgCache[element.src], left + element.x * localTileSize, top + element.y * localTileSize, element.width * localTileSize, element.height * localTileSize);
531
475
  } else {
@@ -537,7 +481,6 @@ function renderRect(context, element, left, top, localTileSize) {
537
481
  if (element.fill) {
538
482
  context.fillRect(left + element.x * localTileSize, top + element.y * localTileSize, element.width * localTileSize, element.height * localTileSize);
539
483
  }
540
-
541
484
  if (element.stroke) {
542
485
  context.strokeRect(left + element.x * localTileSize, top + element.y * localTileSize, element.width * localTileSize, element.height * localTileSize);
543
486
  }
@@ -546,17 +489,13 @@ function renderRect(context, element, left, top, localTileSize) {
546
489
  function renderRect$1(context, element, left, top, localTileSize) {
547
490
  context.beginPath();
548
491
  context.moveTo(left + element.points[0].x * localTileSize, top + element.points[0].y * localTileSize);
549
-
550
492
  for (var i = 0; i < element.points.length; i++) {
551
493
  context.lineTo(left + element.points[i].x * localTileSize, top + element.points[i].y * localTileSize);
552
494
  }
553
-
554
495
  context.lineTo(left + element.points[0].x * localTileSize, top + element.points[0].y * localTileSize);
555
-
556
496
  if (element.fill) {
557
497
  context.fill();
558
498
  }
559
-
560
499
  if (element.stroke) {
561
500
  context.stroke();
562
501
  }
@@ -573,22 +512,17 @@ function renderCanvas(context, width, height, elements, tileSize, state) {
573
512
  var prevStrokeStyle = '';
574
513
  var localTileSize = calcTileSize(tileSize, state.zoom);
575
514
  context.clearRect(0, 0, width, height);
576
-
577
515
  for (var _iterator = _createForOfIteratorHelperLoose(elements), _step; !(_step = _iterator()).done;) {
578
516
  var element = _step.value;
579
-
580
517
  if (element.fill !== prevFillStyle && typeof element.fill !== 'undefined') {
581
518
  context.fillStyle = element.fill;
582
519
  prevFillStyle = element.fill;
583
520
  }
584
-
585
521
  if (element.stroke !== prevStrokeStyle && typeof element.stroke !== 'undefined') {
586
522
  context.strokeStyle = element.stroke;
587
523
  prevStrokeStyle = element.stroke;
588
524
  }
589
-
590
525
  var type = element.constructorName;
591
-
592
526
  if (renderFn[type]) {
593
527
  renderFn[type](context, element, left, top, localTileSize);
594
528
  } else {
@@ -597,54 +531,54 @@ function renderCanvas(context, width, height, elements, tileSize, state) {
597
531
  }
598
532
  }
599
533
 
600
- var _excluded = ["elements", "width", "height", "trackMouseMove", "minZoom", "maxZoom", "tileSize", "onClick", "onRightClick", "onHover", "onElementMoved", "onWheel", "lockXAxis", "lockYAxis", "smoothingQuality", "dragObjects", "deltaLeft", "deltaTop"];
601
- var prevEvent;
534
+ var _excluded = ["elements", "width", "height", "trackMouseMove", "minZoom", "maxZoom", "tileSize", "onClick", "onRightClick", "onHover", "onElementMoved", "onWheel", "onFrame", "lockXAxis", "lockYAxis", "smoothingQuality", "dragObjects", "deltaLeft", "deltaTop"];
535
+ function onRightClickEvent(e) {
536
+ e.preventDefault();
537
+ onRightClick(elementRightClick(e, elements, tileSize, state));
538
+ }
602
539
  function Canvas2D(_ref) {
603
540
  var elements = _ref.elements,
604
- width = _ref.width,
605
- height = _ref.height,
606
- _ref$trackMouseMove = _ref.trackMouseMove,
607
- trackMouseMove = _ref$trackMouseMove === void 0 ? true : _ref$trackMouseMove,
608
- _ref$minZoom = _ref.minZoom,
609
- minZoom = _ref$minZoom === void 0 ? 1 : _ref$minZoom,
610
- _ref$maxZoom = _ref.maxZoom,
611
- maxZoom = _ref$maxZoom === void 0 ? 1 : _ref$maxZoom,
612
- _ref$tileSize = _ref.tileSize,
613
- tileSize = _ref$tileSize === void 0 ? 1 : _ref$tileSize,
614
- onClick = _ref.onClick,
615
- onRightClick = _ref.onRightClick,
616
- onHover = _ref.onHover,
617
- onElementMoved = _ref.onElementMoved,
618
- onWheel = _ref.onWheel,
619
- _ref$lockXAxis = _ref.lockXAxis,
620
- lockXAxis = _ref$lockXAxis === void 0 ? false : _ref$lockXAxis,
621
- _ref$lockYAxis = _ref.lockYAxis,
622
- lockYAxis = _ref$lockYAxis === void 0 ? false : _ref$lockYAxis,
623
- _ref$smoothingQuality = _ref.smoothingQuality,
624
- smoothingQuality = _ref$smoothingQuality === void 0 ? 'medium' : _ref$smoothingQuality,
625
- _ref$dragObjects = _ref.dragObjects,
626
- dragObjects = _ref$dragObjects === void 0 ? false : _ref$dragObjects,
627
- _ref$deltaLeft = _ref.deltaLeft,
628
- deltaLeft = _ref$deltaLeft === void 0 ? 0 : _ref$deltaLeft,
629
- _ref$deltaTop = _ref.deltaTop,
630
- deltaTop = _ref$deltaTop === void 0 ? 0 : _ref$deltaTop,
631
- otherProps = _objectWithoutPropertiesLoose(_ref, _excluded);
632
-
541
+ width = _ref.width,
542
+ height = _ref.height,
543
+ _ref$trackMouseMove = _ref.trackMouseMove,
544
+ trackMouseMove = _ref$trackMouseMove === void 0 ? true : _ref$trackMouseMove,
545
+ _ref$minZoom = _ref.minZoom,
546
+ minZoom = _ref$minZoom === void 0 ? 1 : _ref$minZoom,
547
+ _ref$maxZoom = _ref.maxZoom,
548
+ maxZoom = _ref$maxZoom === void 0 ? 1 : _ref$maxZoom,
549
+ _ref$tileSize = _ref.tileSize,
550
+ tileSize = _ref$tileSize === void 0 ? 1 : _ref$tileSize,
551
+ onClick = _ref.onClick,
552
+ onRightClick = _ref.onRightClick,
553
+ onHover = _ref.onHover,
554
+ onElementMoved = _ref.onElementMoved,
555
+ onWheel = _ref.onWheel,
556
+ onFrame = _ref.onFrame,
557
+ _ref$lockXAxis = _ref.lockXAxis,
558
+ lockXAxis = _ref$lockXAxis === void 0 ? false : _ref$lockXAxis,
559
+ _ref$lockYAxis = _ref.lockYAxis,
560
+ lockYAxis = _ref$lockYAxis === void 0 ? false : _ref$lockYAxis,
561
+ _ref$smoothingQuality = _ref.smoothingQuality,
562
+ smoothingQuality = _ref$smoothingQuality === void 0 ? 'medium' : _ref$smoothingQuality,
563
+ _ref$dragObjects = _ref.dragObjects,
564
+ dragObjects = _ref$dragObjects === void 0 ? false : _ref$dragObjects,
565
+ _ref$deltaLeft = _ref.deltaLeft,
566
+ deltaLeft = _ref$deltaLeft === void 0 ? 0 : _ref$deltaLeft,
567
+ _ref$deltaTop = _ref.deltaTop,
568
+ deltaTop = _ref$deltaTop === void 0 ? 0 : _ref$deltaTop,
569
+ otherProps = _objectWithoutPropertiesLoose(_ref, _excluded);
633
570
  var _useState = useState({}),
634
- state = _useState[0],
635
- setState = _useState[1];
636
-
571
+ state = _useState[0],
572
+ setState = _useState[1];
637
573
  var canvasRef = useCallback(function (canvas) {
638
574
  if (canvas !== null) {
639
575
  var context = canvas.getContext('2d');
640
-
641
576
  if (smoothingQuality === false) {
642
577
  context.imageSmoothingEnabled = false;
643
578
  } else {
644
579
  context.imageSmoothingEnabled = true;
645
580
  context.imageSmoothingQuality = smoothingQuality;
646
581
  }
647
-
648
582
  setState({
649
583
  boundingClientRect: canvas.getBoundingClientRect(),
650
584
  canvas: canvas,
@@ -659,74 +593,68 @@ function Canvas2D(_ref) {
659
593
  }, []);
660
594
  state.deltaTop = deltaTop;
661
595
  state.deltaLeft = deltaLeft;
662
-
663
596
  if (typeof elements !== 'object' || !Array.isArray(elements)) {
664
597
  throw new Error('Invalid elements, should be an array !');
665
598
  }
666
-
667
599
  if (typeof width !== 'number' || typeof height !== 'number') {
668
600
  throw new Error('width/height should be specified and be numbers.');
669
601
  }
670
-
671
602
  if (minZoom > maxZoom) {
672
603
  throw new Error('minZoom should be lower than maxZoom.');
673
604
  }
674
-
675
605
  if (typeof onClick !== 'function' && typeof onClick !== 'undefined') {
676
606
  throw new Error('onClick should be a function.');
677
607
  }
678
-
679
608
  var sortedElements = sortElements(elements);
680
609
  var onMouseMove = null;
681
-
682
610
  if (trackMouseMove) {
683
611
  onMouseMove = function onMouseMove(e) {
684
612
  return mouseMove(e, elements, tileSize, state, setState, lockXAxis, lockYAxis, dragObjects, onElementMoved, onHover);
685
613
  };
686
614
  }
687
-
688
615
  var onWheelFn = function onWheelFn(e) {
689
616
  if (onWheel) {
690
617
  onWheel(e);
691
618
  }
692
-
693
619
  if (minZoom !== maxZoom) {
694
620
  mouseWheel(e, state, setState, minZoom, maxZoom);
695
621
  }
696
622
  };
697
-
698
623
  var onClickFn = null;
699
-
700
624
  if (onClick) {
701
625
  onClickFn = function onClickFn(e) {
702
626
  return onClick(elementClick(e, elements, tileSize, state));
703
627
  };
704
628
  }
705
-
706
- if (onRightClick && state.canvas) {
707
- if (prevEvent) {
708
- state.canvas.removeEventListener('contextmenu', prevEvent);
629
+ useEffect(function () {
630
+ if (onRightClick && state.canvas) {
631
+ state.canvas.addEventListener('contextmenu', onRightClickEvent);
632
+ return state.canvas.removeEventListener('contextmenu', onRightClickEvent);
709
633
  }
710
-
711
- prevEvent = function prevEvent(e) {
712
- e.preventDefault();
713
- onRightClick(elementRightClick(e, elements, tileSize, state));
634
+ }, [state.canvas, onRightClick]);
635
+ useEffect(function () {
636
+ var shouldRender = true;
637
+ function render() {
638
+ if (onFrame) {
639
+ onFrame();
640
+ }
641
+ if (state.context) {
642
+ renderCanvas(state.context, width, height, sortedElements, tileSize, state);
643
+ }
644
+ if (shouldRender) {
645
+ window.requestAnimationFrame(render);
646
+ }
647
+ }
648
+ window.requestAnimationFrame(render);
649
+ return function () {
650
+ shouldRender = false;
714
651
  };
715
-
716
- state.canvas.addEventListener('contextmenu', prevEvent);
717
- }
718
-
719
- if (state.context) {
720
- window.requestAnimationFrame(function () {
721
- renderCanvas(state.context, width, height, sortedElements, tileSize, state);
722
- });
723
- }
724
-
652
+ }, [state.context, onFrame]);
725
653
  return /*#__PURE__*/React.createElement("canvas", _extends({
726
654
  ref: canvasRef,
727
655
  width: width,
728
656
  height: height,
729
- onMouseMove: onMouseMove,
657
+ onPointerMove: onMouseMove,
730
658
  onWheel: onWheelFn,
731
659
  onClick: onClickFn,
732
660
  className: "canvas2d-wrapper"