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); }); }); }); } }; }