tweb/public/5.faa04da46f838e65acdf.chunk.js.map
morethanwords bddc8c745b Build
2021-12-01 16:47:40 +04:00

1 line
50 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts"],"names":["getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","add","draggable","Image","src","document","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","addEventListener","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","e","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","listenerSetter","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","isSendShortcutPressed","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","PopupElement","buttons","element","title","onEscape","back","destroy","dispatchEvent","removeAll","isOverlayActive","removeItem","navigationItem","undefined","setTimeout","cleanup","checkAnimations","confirmShortcutIsSendShortcut","prepend","once","overlayClosable","body","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","find","isCancel","onPop","pushItem","addCancelButton","push","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","forEach","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","split","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener"],"mappings":"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","file":"5.faa04da46f838e65acdf.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType<typeof appDownloadManager.upload>) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '<br>';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean\r\n}>;\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n constructor(className: string, protected buttons?: Array<PopupButton>, options: PopupOptions = {}) {\r\n super(false);\r\n\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons && buttons.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n document.body.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.back('popup');\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n rootScope.isOverlayActive = false;\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n animationIntersector.checkAnimations(false);\r\n }, 150);\r\n };\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise<Blob>, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise<any>, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise<Blob>;\r\nexport type DownloadJson = CancellablePromise<any>;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array<ProgressCallback>} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred<T>(fileName: string) {\r\n const deferred = deferredPromise<T>();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred<Blob>(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred<Blob>(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise<unknown> => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred<InputFile>(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise<InputFile>;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase<any>;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set<Listener> = new Set();\r\n\r\n public add<T extends ListenerElement>(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement<T extends ListenerElement>(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual<T extends ListenerElement>(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n"],"sourceRoot":""}