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