tweb/public/6.02b679f962719848ba99.chunk.js.map
Eduard Kuzmenko 10b7307141 Build
2022-01-25 10:36:42 +04:00

1 line
56 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","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","isSendShortcutPressed","e","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","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","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","title","onEscape","backByItem","navigationItem","destroy","dispatchEvent","removeAll","withoutOverlay","isOverlayActive","removeItem","undefined","POPUPS","setTimeout","cleanup","checkAnimations","confirmShortcutIsSendShortcut","prepend","once","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","find","isCancel","push","onPop","pushItem","popup","parentElement","popupConstructor","addCancelButton","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","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","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":"6.02b679f962719848ba99.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\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 { 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\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\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 { 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\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\nimport { addFullScreenListener, getFullScreenElement, isFullScreen } from \"../../helpers/dom/fullScreen\";\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 withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n private static POPUPS: PopupElement[] = [];\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 protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array<PopupButton>, options: PopupOptions = {}) {\r\n super(false);\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 this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\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?.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 PopupElement.POPUPS.push(this);\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 appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\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\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\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 if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n };\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopup(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.find(element => element instanceof popupConstructor);\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":""}