tweb/public/765.f735370b34f0a3b2396f.chunk.js.map
Eduard Kuzmenko 3cc5df683e Build
2022-08-22 13:05:40 +02:00

1 line
51 KiB
Plaintext

{"version":3,"file":"765.f735370b34f0a3b2396f.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts"],"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 {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\r\nimport {logger} from '../lib/logger';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\r\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\r\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\r\n 'toast',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array<NavigationItem>;\r\n private id: number;\r\n private manual: boolean;\r\n private log: ReturnType<typeof logger>;\r\n private debug: boolean;\r\n private currentHash: string; // have to start with # if not empty\r\n private overriddenHash: string; // have to start with # if not empty\r\n private isPossibleSwipe: boolean;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n this.navigations = [];\r\n this.id = Date.now();\r\n this.manual = false;\r\n this.log = logger('NC');\r\n this.debug = true;\r\n this.currentHash = window.location.hash;\r\n this.overriddenHash = '';\r\n this.isPossibleSwipe = false;\r\n\r\n window.addEventListener('popstate', this.onPopState);\r\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', this.onTouchStart, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private onPopState = (e: PopStateEvent) => {\r\n const hash = window.location.hash;\r\n const id: number = e.state;\r\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\r\n if(hash !== this.currentHash) {\r\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\r\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\r\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\r\n this.overrideHash(this.overriddenHash);\r\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\r\n this.overrideHash();\r\n } else {\r\n this.currentHash = hash;\r\n this.onHashChange && this.onHashChange();\r\n // this.replaceState();\r\n return;\r\n }\r\n }\r\n\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n\r\n if(!this.navigations.length) {\r\n return;\r\n }\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !this.isPossibleSwipe;\r\n this.handleItem(item);\r\n // this.pushState(); // * prevent adding forward arrow\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n };\r\n\r\n private onTouchStart = (e: TouchEvent) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n this.isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n this.isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n };\r\n\r\n public overrideHash(hash: string = '') {\r\n if(hash && hash[0] !== '#') hash = '#' + hash;\r\n else if(hash === '#') hash = '';\r\n\r\n this.overriddenHash = this.currentHash = hash;\r\n this.replaceState();\r\n this.pushState();\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n // if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n // }\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('onItemAdded', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\r\n this.navigations.splice(index, length, ...items);\r\n items.forEach((item) => {\r\n this.onItemAdded(item);\r\n });\r\n }\r\n\r\n private pushState() {\r\n this.debug && this.log('push');\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n this.debug && this.log.warn('replace');\r\n\r\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\r\n history.replaceState(this.id, '', url);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n\r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\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 {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\r\nimport resizeableImage from '../../lib/cropper';\r\nimport PopupElement from '.';\r\nimport {_i18n} from '../../lib/langPack';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\r\nimport rootScope from '../../lib/rootScope';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\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<AppDownloadManager['upload']>) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', {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 const 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\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 ripple from '../ripple';\r\nimport animationIntersector from '../animationIntersector';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {i18n, LangPackKey, _i18n} 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, {EventListenerListeners} from '../../helpers/eventListenerBase';\r\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport overlayCounter from '../../helpers/overlayCounter';\r\nimport Scrollable from '../scrollable';\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: boolean,\r\n overlayClosable: boolean,\r\n withConfirm: LangPackKey | boolean,\r\n body: boolean,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean,\r\n scrollable: boolean,\r\n buttons: Array<PopupButton>,\r\n title: boolean | LangPackKey\r\n}>;\r\n\r\nexport interface PopupElementConstructable<T extends PopupElement = any> {\r\n new(...args: any[]): T;\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\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement<T extends EventListenerListeners = {}> extends EventListenerBase<PopupListeners & T> {\r\n private static POPUPS: PopupElement<any>[] = [];\r\n public static MANAGERS: AppManagers;\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: HTMLElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n protected managers: AppManagers;\r\n\r\n protected scrollable: Scrollable;\r\n\r\n protected buttons: Array<PopupButton>;\r\n\r\n constructor(className: string, 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\r\n if(options.title) {\r\n this.title.classList.add('popup-title');\r\n if(typeof(options.title) === 'string') {\r\n _i18n(this.title, options.title);\r\n }\r\n\r\n this.header.append(this.title);\r\n }\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n this.managers = PopupElement.MANAGERS;\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 if(options.scrollable) {\r\n const scrollable = this.scrollable = new Scrollable(this.body);\r\n scrollable.onAdditionalScroll = () => {\r\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\r\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\r\n };\r\n\r\n scrollable.container.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\r\n\r\n if(!this.body) {\r\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\r\n }\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n const buttons = this.buttons = options.buttons;\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 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 protected onContentUpdate() {\r\n if(this.scrollable) {\r\n this.scrollable.onAdditionalScroll();\r\n }\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 this.onContentUpdate();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.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 if(!this.element.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\r\n return;\r\n }\r\n\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 protected destroy() {\r\n this.dispatchEvent<PopupListeners>('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 overlayCounter.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<PopupListeners>('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 getPopups<T extends PopupElement>(popupConstructor: PopupElementConstructable<T>) {\r\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\r\n }\r\n\r\n public static createPopup<T extends PopupElement, A extends Array<any>>(ctor: {new(...args: A): T}, ...args: A) {\r\n const popup = new ctor(...args);\r\n return popup;\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","/*\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise<string>;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise<string>;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise<ArrayBuffer>;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise<any> {\n // const perf = performance.now();\n return new Promise<any>((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\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 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","/*\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 {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n"],"names":["appNavigationController","constructor","onPopState","e","hash","window","location","id","state","this","debug","log","isPossibleSwipe","currentHash","warn","overriddenHash","overrideHash","onHashChange","pushState","navigations","length","item","pop","manual","handleItem","onKeyDown","key","onEscape","back","type","onTouchStart","touches","addEventListener","setTimeout","passive","once","Date","now","capture","IS_MOBILE_SAFARI","options","history","scrollRestoration","replaceState","good","onPop","undefined","pushItem","noBlurOnPop","findItemByType","i","index","ret","backByItem","indexOf","splice","onItemAdded","noHistory","push","unshiftItem","unshift","spliceItems","items","forEach","url","origin","pathname","search","removeItem","removeByType","single","PopupAvatar","super","closable","withConfirm","image","Image","cropper","crop","removeHandlers","h6","document","createElement","btnClose","classList","remove","header","append","cropContainer","add","input","style","display","listenerSetter","file","target","files","readBlobAsDataURL","then","contents","src","onload","show","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","draggable","overlayColor","appendChild","parentNode","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","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","getContext","drawImage","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","open","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","element","title","navigationItem","managers","MANAGERS","confirmShortcutIsSendShortcut","prepend","withoutOverlay","overlayClosable","scrollable","onAdditionalScroll","toggle","scrollTop","isScrolledDown","insertBefore","nextSibling","btnConfirmOnEnter","buttons","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","destroy","find","isCancel","POPUPS","onContentUpdate","contains","dispatchEvent","removeAll","cleanup","static","popup","parentElement","popupConstructor","filter","ctor","args","addCancelButton","method","Promise","reader","FileReader","result","readBlobAs","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","bind","split","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","isSendShortcutPressed","IS_MOBILE","isComposing","shiftKey","ctrlKey","metaKey","secondaryKey","IS_APPLE","isSwipingBackSafari","TouchEvent"],"sourceRoot":""}