import { UpploadEffect } from "../../effect";
import Cropper from "cropperjs";
import {
IHandlersParams,
ITemplateParams,
IUpploadFile,
} from "../../helpers/interfaces";
import {
safeListen,
fitImageToContainer,
canvasToBlob,
} from "../../helpers/elements";
export default class Rotate extends UpploadEffect {
name = "rotate";
icon = ``;
value = 0;
max = 360;
unit = "deg";
originalFile: IUpploadFile = { blob: new Blob() };
template = ({ file, translate }: ITemplateParams) => {
const image = URL.createObjectURL(file.blob);
this.originalFile = file;
return `
0${
translate(`units.${this.unit}`) || this.unit
}
`;
};
handlers = (params: IHandlersParams) => {
const rotatorElement = params.uppload.container.querySelector(
".uppload-rotating-element img"
) as HTMLImageElement | null;
const originalFile = this.originalFile;
if (rotatorElement) {
fitImageToContainer(params, rotatorElement).then(() => {
const rotator = new Cropper(rotatorElement, {
autoCropArea: 1,
viewMode: 1,
dragMode: "none",
cropBoxMovable: false,
cropBoxResizable: false,
toggleDragModeOnDblclick: false,
ready() {
params.uppload.emitter.emit("processing");
canvasToBlob(rotator.getCroppedCanvas()).then((blob) => {
originalFile.blob = blob;
params.uppload.emitter.emit("process");
params.next(originalFile);
});
},
});
const range = params.uppload.container.querySelector(
".settings input[type='range']"
) as HTMLInputElement;
if (range)
safeListen(range, "change", () => {
let value = 0;
const range = params.uppload.container.querySelector(
".settings input[type='range']"
) as HTMLInputElement;
if (range) value = parseInt(range.value);
const displayer = params.uppload.container.querySelector(
".settings .value span"
);
if (displayer) displayer.innerHTML = value.toString();
rotator.rotate(value - this.value);
this.value = value;
params.uppload.emitter.emit("processing");
canvasToBlob(rotator.getCroppedCanvas()).then((blob) => {
originalFile.blob = blob;
params.uppload.emitter.emit("process");
params.next(originalFile);
});
});
});
}
};
}