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.
118 lines
3.4 KiB
118 lines
3.4 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import type {AppDownloadManager} from '../../lib/appManagers/appDownloadManager'; |
|
import resizeableImage from '../../lib/cropper'; |
|
import PopupElement from '.'; |
|
import {_i18n} from '../../lib/langPack'; |
|
import {attachClickEvent} from '../../helpers/dom/clickEvent'; |
|
import readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL'; |
|
import rootScope from '../../lib/rootScope'; |
|
import appDownloadManager from '../../lib/appManagers/appDownloadManager'; |
|
|
|
export default class PopupAvatar extends PopupElement { |
|
private cropContainer: HTMLElement; |
|
private input: HTMLInputElement; |
|
private h6: HTMLElement; |
|
|
|
private image = new Image(); |
|
|
|
private canvas: HTMLCanvasElement; |
|
private blob: Blob; |
|
private cropper = { |
|
crop: () => {}, |
|
removeHandlers: () => {} |
|
}; |
|
|
|
private onCrop: (upload: () => ReturnType<AppDownloadManager['upload']>) => void; |
|
|
|
constructor(options: Partial<{ |
|
isForum: boolean |
|
}> = {}) { |
|
super('popup-avatar', {closable: true, withConfirm: true}); |
|
|
|
this.h6 = document.createElement('h6'); |
|
_i18n(this.h6, 'Popup.Avatar.Title'); |
|
|
|
this.btnClose.classList.remove('btn-icon'); |
|
|
|
this.header.append(this.h6); |
|
|
|
this.cropContainer = document.createElement('div'); |
|
this.cropContainer.classList.add('crop'); |
|
this.cropContainer.append(this.image); |
|
|
|
if(options.isForum) { |
|
this.cropContainer.classList.add('is-forum'); |
|
} |
|
|
|
this.input = document.createElement('input'); |
|
this.input.type = 'file'; |
|
this.input.style.display = 'none'; |
|
this.listenerSetter.add(this.input)('change', (e: any) => { |
|
const file = e.target.files[0]; |
|
if(!file) { |
|
return; |
|
} |
|
|
|
readBlobAsDataURL(file).then((contents) => { |
|
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.show(); |
|
|
|
this.cropper = resizeableImage(this.image, this.canvas); |
|
this.input.value = ''; |
|
}; |
|
}); |
|
}, false); |
|
|
|
this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1'; |
|
attachClickEvent(this.btnConfirm, () => { |
|
this.cropper.crop(); |
|
this.hide(); |
|
|
|
this.canvas.toBlob((blob) => { |
|
this.blob = blob; // save blob to send after reg |
|
this.darkenCanvas(); |
|
this.resolve(); |
|
}, 'image/jpeg', 1); |
|
}, {listenerSetter: this.listenerSetter}); |
|
|
|
this.container.append(this.cropContainer, this.btnConfirm, this.input); |
|
|
|
this.addEventListener('closeAfterTimeout', () => { |
|
this.cropper.removeHandlers(); |
|
if(this.image) { |
|
this.image.remove(); |
|
} |
|
}); |
|
} |
|
|
|
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() { |
|
const ctx = this.canvas.getContext('2d'); |
|
ctx.fillStyle = 'rgba(0, 0, 0, 0.3)'; |
|
ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); |
|
} |
|
}
|
|
|