import {
ACTION_CROP,
ACTION_ZOOM,
CLASS_CROP,
CLASS_MODAL,
DATA_ACTION,
DRAG_MODE_CROP,
DRAG_MODE_MOVE,
DRAG_MODE_NONE,
EVENT_CROP_END,
EVENT_CROP_MOVE,
EVENT_CROP_START,
REGEXP_ACTIONS,
} from './constants';
import {
addClass,
dispatchEvent,
each,
extend,
getData,
getPointer,
hasClass,
toggleClass,
} from './utilities';
export default {
resize() {
const { options, container, containerData } = this;
const minContainerWidth = Number(options.minContainerWidth) || 200;
const minContainerHeight = Number(options.minContainerHeight) || 100;
if (this.disabled || containerData.width <= minContainerWidth ||
containerData.height <= minContainerHeight) {
return;
}
const ratio = container.offsetWidth / containerData.width;
// Resize when width changed or height changed
if (ratio !== 1 || container.offsetHeight !== containerData.height) {
let canvasData;
let cropBoxData;
if (options.restore) {
canvasData = this.getCanvasData();
cropBoxData = this.getCropBoxData();
}
this.render();
if (options.restore) {
this.setCanvasData(each(canvasData, (n, i) => {
canvasData[i] = n * ratio;
}));
this.setCropBoxData(each(cropBoxData, (n, i) => {
cropBoxData[i] = n * ratio;
}));
}
}
},
dblclick() {
if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {
return;
}
this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);
},
wheel(e) {
const ratio = Number(this.options.wheelZoomRatio) || 0.1;
let delta = 1;
if (this.disabled) {
return;
}
e.preventDefault();
// Limit wheel speed to prevent zoom too fast (#21)
if (this.wheeling) {
return;
}
this.wheeling = true;
setTimeout(() => {
this.wheeling = false;
}, 50);
if (e.deltaY) {
delta = e.deltaY > 0 ? 1 : -1;
} else if (e.wheelDelta) {
delta = -e.wheelDelta / 120;
} else if (e.detail) {
delta = e.detail > 0 ? 1 : -1;
}
this.zoom(-delta * ratio, e);
},
cropStart(e) {
if (this.disabled) {
return;
}
const { options, pointers } = this;
let action;
if (e.changedTouches) {
// Handle touch event
each(e.changedTouches, (touch) => {
pointers[touch.identifier] = getPointer(touch);
});
} else {
// Handle mouse event and pointer event
pointers[e.pointerId || 0] = getPointer(e);
}
if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {
action = ACTION_ZOOM;
} else {
action = getData(e.target, DATA_ACTION);
}
if (!REGEXP_ACTIONS.test(action)) {
return;
}
if (dispatchEvent(this.element, EVENT_CROP_START, {
originalEvent: e,
action,
}) === false) {
return;
}
e.preventDefault();
this.action = action;
this.cropping = false;
if (action === ACTION_CROP) {
this.cropping = true;
addClass(this.dragBox, CLASS_MODAL);
}
},
cropMove(e) {
const { action } = this;
if (this.disabled || !action) {
return;
}
const { pointers } = this;
e.preventDefault();
if (dispatchEvent(this.element, EVENT_CROP_MOVE, {
originalEvent: e,
action,
}) === false) {
return;
}
if (e.changedTouches) {
each(e.changedTouches, (touch) => {
extend(pointers[touch.identifier], getPointer(touch, true));
});
} else {
extend(pointers[e.pointerId || 0], getPointer(e, true));
}
this.change(e);
},
cropEnd(e) {
if (this.disabled) {
return;
}
const { action, pointers } = this;
if (e.changedTouches) {
each(e.changedTouches, (touch) => {
delete pointers[touch.identifier];
});
} else {
delete pointers[e.pointerId || 0];
}
if (!action) {
return;
}
e.preventDefault();
if (!Object.keys(pointers).length) {
this.action = '';
}
if (this.cropping) {
this.cropping = false;
toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);
}
dispatchEvent(this.element, EVENT_CROP_END, {
originalEvent: e,
action,
});
},
};