Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.8 KiB
98 lines
2.8 KiB
import resizeableImage from "../lib/cropper"; |
|
import appDownloadManager from "../lib/appManagers/appDownloadManager"; |
|
|
|
export class PopupAvatar { |
|
private container = document.getElementById('popup-avatar'); |
|
private input = this.container.querySelector('input') as HTMLInputElement; |
|
private cropContainer = this.container.querySelector('.crop') as HTMLDivElement; |
|
private closeBtn = this.container.querySelector('.popup-close') as HTMLButtonElement; |
|
private image = new Image(); |
|
|
|
private canvas: HTMLCanvasElement; |
|
private blob: Blob; |
|
private cropper = { |
|
crop: () => {}, |
|
removeHandlers: () => {} |
|
}; |
|
|
|
private onCrop: (upload: () => ReturnType<typeof appDownloadManager.upload>) => void; |
|
|
|
constructor() { |
|
this.container.style.display = ''; // need for no blink |
|
this.cropContainer.append(this.image); |
|
|
|
this.input.addEventListener('change', (e: any) => { |
|
var file = e.target.files[0]; |
|
if(!file) { |
|
return; |
|
} |
|
|
|
var reader = new FileReader(); |
|
reader.onload = (e) => { |
|
var contents = e.target.result as string; |
|
|
|
this.image = new Image(); |
|
this.cropContainer.append(this.image); |
|
this.image.src = contents; |
|
|
|
this.image.onload = () => { |
|
/* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554); |
|
cropContainer.style.width = w + 'px'; |
|
cropContainer.style.height = h + 'px'; */ |
|
this.container.classList.remove('hide'); |
|
void this.container.offsetWidth; // reflow |
|
this.container.classList.add('active'); |
|
|
|
this.cropper = resizeableImage(this.image, this.canvas); |
|
this.input.value = ''; |
|
}; |
|
}; |
|
|
|
reader.readAsDataURL(file); |
|
}, false); |
|
|
|
// apply |
|
this.container.querySelector('.btn-crop').addEventListener('click', () => { |
|
this.cropper.crop(); |
|
this.closeBtn.click(); |
|
|
|
this.canvas.toBlob(blob => { |
|
this.blob = blob; // save blob to send after reg |
|
this.darkenCanvas(); |
|
this.resolve(); |
|
}, 'image/jpeg', 1); |
|
}); |
|
|
|
this.closeBtn.addEventListener('click', () => { |
|
setTimeout(() => { |
|
this.cropper.removeHandlers(); |
|
if(this.image) { |
|
this.image.remove(); |
|
} |
|
|
|
this.container.classList.add('hide'); |
|
}, 200); |
|
}); |
|
} |
|
|
|
private resolve() { |
|
this.onCrop(() => { |
|
return appDownloadManager.upload(this.blob); |
|
}); |
|
} |
|
|
|
public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) { |
|
this.canvas = postCanvas; |
|
this.onCrop = onCrop; |
|
|
|
this.input.click(); |
|
} |
|
|
|
public darkenCanvas() { |
|
let ctx = this.canvas.getContext('2d'); |
|
ctx.fillStyle = "rgba(0, 0, 0, 0.3)"; |
|
ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); |
|
} |
|
} |
|
|
|
export default new PopupAvatar();
|
|
|