tweb/public/4.979ab7b45c91475f0598.chunk.js.map
Eduard Kuzmenko 6e7128d3d6 Build
2021-04-18 15:56:55 +04:00

1 line
47 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/components/popups/index.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts"],"names":["PopupElement","className","buttons","options","element","document","createElement","container","header","title","onEscape","hide","back","destroy","this","onClose","classList","add","remove","btnClose","removeEventListener","overlayIsActive","removeItem","navigationItem","undefined","setTimeout","onCloseAfterTimeout","checkAnimations","append","closable","prepend","addEventListener","once","overlayClosable","onOverlayClick","e","target","withConfirm","btnConfirm","body","length","buttonsDiv","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","isCancel","type","onPop","pushItem","offsetWidth","addCancelButton","find","push","passwordManager","invokeApi","then","result","settings","getState","state","currentHashPromise","newHashPromise","params","password","new_settings","_","hint","email","currentPassword","computeSRP","Promise","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","all","hashes","new_password_hash","inputCheckPassword","auth","saveApiUser","user","setUserAuth","id","code","PasswordInputField","super","plainText","passwordVisible","onVisibilityClick","toggleVisible","toggle","input","onVisibilityClickAdditional","setAttribute","autocomplete","stealthy","tabIndex","parentElement","insertBefore","cloneNode","nextSibling","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationFromURL","loop","autoplay","width","height","noCache","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","originalImage","canvas","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","draggable","Image","src","overlayColor","appendChild","parentNode","style","maxWidth","naturalWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","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","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","image","cropper","h6","cropContainer","display","file","files","reader","FileReader","contents","show","value","readAsDataURL","btnSubmit","ripple","click","toBlob","blob","darkenCanvas","onCrop","appDownloadManager","upload","postCanvas","ctx","fillStyle","fillRect","TrackingMonkey","inputField","max","playAnimation","frame","min","round","idleAnimation","stop","CodeInputField","lastLength","setLabel","replace","slice","setValueSilently","onFill"],"mappings":"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","file":"4.979ab7b45c91475f0598.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 rootScope from \"../../lib/rootScope\";\r\nimport { blurActiveElement } from \"../../helpers/dom\";\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\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};\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}>;\r\n\r\nexport default class 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: HTMLElement;\r\n protected body: HTMLElement;\r\n\r\n protected onClose: () => void;\r\n protected onCloseAfterTimeout: () => void;\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(className: string, buttons?: Array<PopupButton>, options: PopupOptions = {}) {\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 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 this.btnClose.addEventListener('click', this.hide, {once: true});\r\n }\r\n\r\n if(options.overlayClosable) {\r\n const onOverlayClick = (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n this.element.removeEventListener('click', onOverlayClick);\r\n }\r\n };\r\n \r\n this.element.addEventListener('click', onOverlayClick);\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(buttons && buttons.length) {\r\n const buttonsDiv = 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 if(b.callback) {\r\n button.addEventListener('click', () => {\r\n b.callback();\r\n this.destroy();\r\n }, {once: true});\r\n } else if(b.isCancel) {\r\n button.addEventListener('click', () => {\r\n this.destroy();\r\n }, {once: true});\r\n }\r\n \r\n return button;\r\n });\r\n \r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\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.overlayIsActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.back('popup');\r\n };\r\n\r\n private destroy = () => {\r\n this.onClose && this.onClose();\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n\r\n if(this.btnClose) this.btnClose.removeEventListener('click', this.hide);\r\n rootScope.overlayIsActive = 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.onCloseAfterTimeout && this.onCloseAfterTimeout();\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport appUsersManager from '../appManagers/appUsersManager';\r\nimport apiManager from './mtprotoworker';\r\n//import { computeCheck } from \"../crypto/srp\";\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise<AccountPassword> {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\r\n let newHashPromise: Promise<Uint8Array>;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n appUsersManager.saveApiUser(auth.user);\r\n apiManager.setUserAuth(auth.user.id);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { cancelEvent } from \"../helpers/dom\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: Promise<void>;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\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 appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { ripple } from \"../ripple\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private btnSubmit: HTMLElement;\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});\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.input.addEventListener('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n \r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const contents = e.target.result as string;\r\n \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 \r\n reader.readAsDataURL(file);\r\n }, false);\r\n\r\n this.btnSubmit = document.createElement('button');\r\n this.btnSubmit.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n ripple(this.btnSubmit);\r\n this.btnSubmit.addEventListener('click', () => {\r\n this.cropper.crop();\r\n this.btnClose.click();\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 });\r\n\r\n this.container.append(this.cropContainer, this.btnSubmit, this.input);\r\n\r\n this.onCloseAfterTimeout = () => {\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 InputField from \"../inputField\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise<any>;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'assets/img/TwoFactorSetupMonkeyIdle.tgs').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'assets/img/TwoFactorSetupMonkeyTracking.tgs').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: number) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(+this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n"],"sourceRoot":""}