tweb/public/10.3d2ff0c89d1ab9802209.chunk.js.map
morethanwords 66a722b74f Build
2021-04-23 22:06:21 +04:00

1 line
72 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/components/popups/index.ts","webpack:///./src/pages/pageIm.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.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/pages/pagePassword.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/pageAuthCode.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","page","pushToState","_","then","m","default","broadcast","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","Promise","resolve","window","requestAnimationFrame","finally","passwordManager","invokeApi","result","settings","getState","state","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","computeSRP","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","all","hashes","new_password_hash","inputCheckPassword","auth","saveApiUser","user","setUserAuth","id","code","LoginPage","querySelector","imageDiv","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","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","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","passwordInput","btnNext","btnNextI18n","IntlElement","key","label","name","getStateInterval","setInterval","_state","wrapEmojiText","setLabel","onSubmit","update","preloader","check","response","clearInterval","mount","monkey","removeAttribute","catch","err","select","isMobile","load","focus","saveState","TrackingMonkey","inputField","max","playAnimation","frame","min","round","idleAnimation","stop","CodeInputField","lastLength","replace","slice","setValueSilently","onFill","authCode","imported","avatarPreview","addIco","appProfileManager","uploadAvatar","open","_uploadAvatar","handleInput","nameInputField","lastName","lastNameInputField","fullName","trim","maxLength","btnSignUp","btnI18n","contains","disabled","phone_number","phone_code_hash","first_name","last_name","reject","inputFile","uploadProfilePhoto","_authCode","codeInput","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","pageEl","cleanup","phone_code","ignoreErrors","good","handled","innerText","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode"],"mappings":"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","file":"10.3d2ff0c89d1ab9802209.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 rootScope from \"../../lib/rootScope\";\nimport { blurActiveElement } from \"../../helpers/dom\";\nimport { ripple } from \"../ripple\";\nimport animationIntersector from \"../animationIntersector\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: true,\n isCancel?: true\n};\n\nexport type PopupOptions = Partial<{\n closable: true, \n overlayClosable: true, \n withConfirm: LangPackKey | true, \n body: true\n}>;\n\nexport default class PopupElement {\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLElement;\n protected body: HTMLElement;\n\n protected onClose: () => void;\n protected onCloseAfterTimeout: () => void;\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n constructor(className: string, buttons?: Array<PopupButton>, options: PopupOptions = {}) {\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n this.title.classList.add('popup-title');\n\n this.header.append(this.title);\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n //ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n this.btnClose.addEventListener('click', this.hide, {once: true});\n }\n\n if(options.overlayClosable) {\n const onOverlayClick = (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n this.element.removeEventListener('click', onOverlayClick);\n }\n };\n \n this.element.addEventListener('click', onOverlayClick);\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(buttons && buttons.length) {\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n if(buttons.length === 2) {\n buttonsDiv.classList.add('popup-buttons-row');\n }\n \n const buttonsElements = buttons.map(b => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n ripple(button);\n \n if(b.text) {\n button.innerHTML = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n \n if(b.callback) {\n button.addEventListener('click', () => {\n b.callback();\n this.destroy();\n }, {once: true});\n } else if(b.isCancel) {\n button.addEventListener('click', () => {\n this.destroy();\n }, {once: true});\n }\n \n return button;\n });\n \n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.element.append(this.container);\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: this.destroy,\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n document.body.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n rootScope.overlayIsActive = true;\n animationIntersector.checkAnimations(true);\n }\n\n public hide = () => {\n appNavigationController.back('popup');\n };\n\n private destroy = () => {\n this.onClose && this.onClose();\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n\n if(this.btnClose) this.btnClose.removeEventListener('click', this.hide);\n rootScope.overlayIsActive = false;\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n setTimeout(() => {\n this.element.remove();\n this.onCloseAfterTimeout && this.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false);\n }, 150);\n };\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find(b => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\n};\n","//import {stackBlurImage} from '../lib/StackBlur';\n//import appStateManager from \"../lib/appManagers/appStateManager\";\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 { blurActiveElement } from \"../helpers/dom\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport I18n from \"../lib/langPack\";\nimport Page from \"./page\";\n\nlet onFirstMount = () => {\n //return;\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\n // ! TOO SLOW\n /* appStateManager.saveState(); */\n\n import('../lib/rootScope').then(m => {\n m.default.broadcast('im_mount');\n });\n\n if(!I18n.requestedServerLanguage) {\n I18n.getCacheLangPack().then(langPack => {\n if(langPack.local) {\n I18n.getLangPack(langPack.lang_code);\n }\n });\n }\n\n blurActiveElement();\n return new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => {\n const promise = import('../lib/appManagers/appDialogsManager');\n promise.finally(async() => {\n //alert('pageIm!');\n resolve();\n \n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n \n /* // @ts-ignore\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\n alert('AudioContext:' + typeof(AudioContext));\n // @ts-ignore\n alert('global.navigator:' + typeof(navigator));\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\n \n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n });\n });\n\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\n /* fetch('assets/img/camomile.jpg')\n .then(res => res.blob())\n .then(blob => {\n let img = new Image();\n let url = URL.createObjectURL(blob);\n img.src = url;\n img.onload = () => {\n let id = 'chat-background-canvas';\n var canvas = document.getElementById(id) as HTMLCanvasElement;\n //URL.revokeObjectURL(url);\n \n let elements = ['.chat-container'].map(selector => {\n return document.querySelector(selector) as HTMLDivElement;\n });\n \n stackBlurImage(img, id, 15, 0);\n \n canvas.toBlob(blob => {\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\n let dataUrl = URL.createObjectURL(blob);\n \n elements.forEach(el => {\n el.style.backgroundImage = 'url(' + dataUrl + ')';\n });\n }, 'image/jpeg', 1);\n };\n }); */\n //});\n};\n\nconst page = new Page('page-chats', false, onFirstMount);\nexport default page;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appUsersManager from '../appManagers/appUsersManager';\nimport apiManager from './mtprotoworker';\n//import { computeCheck } from \"../crypto/srp\";\n\nexport class PasswordManager {\n public getState(): Promise<AccountPassword> {\n return apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n //state = Object.assign({}, state);\n //state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then(state => {\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\n let newHashPromise: Promise<Uint8Array>;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n \n if(settings.currentPassword) {\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n \n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n salt1.randomize();\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n \n if(settings.newPassword) {\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n \n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n \n return apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\n //console.log('SRP', inputCheckPassword);\n return apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword\n }, options).then(auth => {\n if(auth._ === 'auth.authorization') {\n appUsersManager.saveApiUser(auth.user);\n apiManager.setUserAuth(auth.user.id);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n\nconst passwordManager = new PasswordManager();\nMOUNT_CLASS_TO.passwordManager = passwordManager;\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n //this.element = document.createElement('div');\n //this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n \n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.container);\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 { cancelEvent } from \"../helpers/dom\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class PasswordInputField extends InputField {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n const input = this.input as HTMLInputElement;\n input.type = 'password';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n /* input.readOnly = true;\n\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true}); */\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n this.container.classList.add('input-field-password');\n this.container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\nimport PasswordInputField from \"../passwordInputField\";\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: Promise<void>;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\n //return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n //console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n } \n });\n\n this.passwordInputField.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\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\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement, \n container: HTMLDivElement, \n cropImage: HTMLImageElement, \n event_state: Partial<{ \n mouse_x: number, \n mouse_y: number, \n container_width: number, \n container_height: number, \n container_left: number, \n container_top: number\n }> = {}, \n keyZoomValue = 4.0, \n MINWIDTH = 50, \n MINHEIGHT = 50, \n CROPWIDTH = 200, \n CROPHEIGHT = 200, \n cropLeft = 0, \n cropTop = 0, \n cropWidth = 0, \n cropHeight = 0,\n scaledRatio = 0;\n \n if(originalImage.complete) init();\n else originalImage.onload = init;\n \n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n \n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n \n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n \n document.addEventListener('keypress', keyHandler, false);\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n \n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n \n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n \n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n \n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n \n container = document.createElement('div');\n container.classList.add('crop-overlay');\n \n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n \n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n \n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n \n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n //crop();\n }\n \n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n \n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n \n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n \n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n \n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n \n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n \n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom), \n newHeight = Math.floor(container.clientHeight + zoom), \n w = cropImage.clientWidth, \n h = cropImage.clientHeight, \n left: number, \n top: number, \n right: number, \n bottom: number;\n \n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n \n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n \n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n //crop();\n }\n \n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n \n switch (String.fromCharCode(e.charCode)) {\n case '+' :\n imgZoom(keyZoomValue);\n break;\n case '-' :\n imgZoom(-keyZoomValue);\n break;\n }\n }\n \n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n \n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n \n saveEventState(e);\n \n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n \n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n \n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n \n function moving(e: any) {\n let currentTouch = {x: 0, y: 0}, \n left: number, \n top: number, \n w: number, \n h: number;\n \n e.preventDefault();\n e.stopPropagation();\n \n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n \n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n \n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n \n updateCropImage(left, top);\n updateContainer(left, top);\n //crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n \n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n \n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\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 appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport resizeableImage from \"../../lib/cropper\";\nimport PopupElement from \".\";\nimport { ripple } from \"../ripple\";\nimport { _i18n } from \"../../lib/langPack\";\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private btnSubmit: HTMLElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType<typeof appDownloadManager.upload>) => void;\n\n constructor() {\n super('popup-avatar', null, {closable: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.input.addEventListener('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n \n const reader = new FileReader();\n reader.onload = (e) => {\n const contents = e.target.result as string;\n \n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n \n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n \n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n };\n \n reader.readAsDataURL(file);\n }, false);\n\n this.btnSubmit = document.createElement('button');\n this.btnSubmit.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n ripple(this.btnSubmit);\n this.btnSubmit.addEventListener('click', () => {\n this.cropper.crop();\n this.btnClose.click();\n\n this.canvas.toBlob(blob => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n });\n\n this.container.append(this.cropContainer, this.btnSubmit, this.input);\n\n this.onCloseAfterTimeout = () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n };\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n let ctx = this.canvas.getContext('2d');\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\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 { putPreloader } from '../components/misc';\nimport mediaSizes from '../helpers/mediaSizes';\nimport { AccountPassword } from '../layer';\nimport appStateManager from '../lib/appManagers/appStateManager';\nimport passwordManager from '../lib/mtproto/passwordManager';\nimport Page from './page';\nimport pageIm from './pageIm';\nimport Button from '../components/button';\nimport PasswordInputField from '../components/passwordInputField';\nimport PasswordMonkey from '../components/monkeys/password';\nimport RichTextProcessor from '../lib/richtextprocessor';\nimport I18n from '../lib/langPack';\nimport LoginPage from './loginPage';\nimport { attachClickEvent, cancelEvent, htmlToSpan, replaceContent, toggleDisability } from '../helpers/dom';\n\nconst TEST = false;\nlet passwordInput: HTMLInputElement;\n\nlet onFirstMount = (): Promise<any> => {\n const page = new LoginPage({\n className: 'page-password',\n withInputWrapper: true,\n titleLangKey: 'Login.Password.Title',\n subtitleLangKey: 'Login.Password.Subtitle'\n });\n\n const btnNext = Button('btn-primary btn-color-primary');\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\n\n btnNext.append(btnNextI18n.element);\n\n const passwordInputField = new PasswordInputField({\n label: 'LoginPassword',\n name: 'password'\n });\n\n passwordInput = passwordInputField.input as HTMLInputElement;\n\n page.inputWrapper.append(passwordInputField.container, btnNext);\n\n let getStateInterval: number;\n\n let getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return !TEST && passwordManager.getState().then(_state => {\n state = _state;\n\n if(state.hint) {\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\n } else {\n passwordInputField.setLabel();\n }\n });\n };\n\n let state: AccountPassword;\n \n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n\n const toggle = toggleDisability([passwordInput, btnNext], true);\n let value = passwordInput.value;\n\n btnNextI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(btnNext);\n\n passwordManager.check(value, state).then((response) => {\n //console.log('passwordManager response:', response);\n \n switch(response._) {\n case 'auth.authorization':\n clearInterval(getStateInterval);\n pageIm.mount();\n if(monkey) monkey.remove();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNextI18n.update({key: response._ as any});\n preloader.remove();\n break;\n }\n }).catch((err: any) => {\n toggle();\n passwordInputField.input.classList.add('error');\n \n switch(err.type) {\n default:\n //btnNext.innerText = err.type;\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\n passwordInput.select();\n break;\n }\n\n preloader.remove();\n \n getState();\n });\n };\n \n attachClickEvent(btnNext, onSubmit);\n\n passwordInput.addEventListener('keypress', function(this, e) {\n this.classList.remove('error');\n btnNextI18n.update({key: 'Login.Next'});\n\n if(e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new PasswordMonkey(passwordInputField, size);\n page.imageDiv.append(monkey.container);\n return Promise.all([\n monkey.load(),\n getState()\n ]);\n};\n\nconst page = new Page('page-password', true, onFirstMount, null, () => {\n //if(!isAppleMobile) {\n passwordInput.focus();\n //}\n\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\n appStateManager.saveState();\n});\n\nexport default page;\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 InputField from \"../inputField\";\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise<any>;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas.style.display = 'none';\n }\n \n this.animation.canvas.style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n \n frame = 0;\n }\n //animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n //console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n \n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n //animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationFromURL({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'assets/img/TwoFactorSetupMonkeyIdle.tgs').then(animation => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationFromURL({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'assets/img/TwoFactorSetupMonkeyTracking.tgs').then(_animation => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas.style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n //console.log('enterFrame', currentFrame, needFrame);\n //let currentFrame = Math.round(e.currentTime);\n \n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n //animation.curFrame = 0;\n \n if(this.idleAnimation) {\n this.idleAnimation.canvas.style.display = '';\n this.idleAnimation.play();\n this.animation.canvas.style.display = 'none';\n }\n }\n });\n //console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class CodeInputField extends InputField {\n constructor(options: InputFieldOptions & {\n length: number,\n onFill: (code: number) => void\n }) {\n super({\n plainText: true,\n ...options\n });\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n \n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n \n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(+this.value);\n } else if(length === lastLength) {\n return;\n }\n \n lastLength = length;\n });\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 { CancellablePromise } from '../helpers/cancellablePromise';\nimport type { InputFile } from '../layer';\nimport type { AuthState } from '../types';\nimport Button from '../components/button';\nimport InputField from '../components/inputField';\nimport { putPreloader } from '../components/misc';\nimport PopupAvatar from '../components/popups/avatar';\nimport { blurActiveElement, replaceContent } from '../helpers/dom';\nimport appStateManager from '../lib/appManagers/appStateManager';\nimport I18n, { i18n } from '../lib/langPack';\n//import apiManager from '../lib/mtproto/apiManager';\nimport apiManager from '../lib/mtproto/mtprotoworker';\nimport RichTextProcessor from '../lib/richtextprocessor';\nimport LoginPage from './loginPage';\nimport Page from './page';\nimport pageIm from './pageIm';\n\nlet authCode: AuthState.signUp['authCode'] = null;\n\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\n const page = new LoginPage({\n className: 'page-signUp',\n withInputWrapper: true,\n titleLangKey: 'YourName',\n subtitleLangKey: 'Login.Register.Subtitle'\n });\n\n page.imageDiv.classList.add('avatar-edit');\n\n page.title.classList.add('fullName');\n\n const avatarPreview = document.createElement('canvas');\n avatarPreview.id = 'canvas-avatar';\n avatarPreview.className = 'avatar-edit-canvas';\n\n const addIco = document.createElement('span');\n addIco.className = 'tgico tgico-cameraadd';\n\n page.imageDiv.append(avatarPreview, addIco);\n \n const appProfileManager = imported.default;\n\n let uploadAvatar: () => CancellablePromise<InputFile>;\n page.imageDiv.addEventListener('click', () => {\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\n uploadAvatar = _uploadAvatar;\n });\n });\n\n const handleInput = (e: Event) => {\n const name = nameInputField.value || '';\n const lastName = lastNameInputField.value || '';\n\n const fullName = name || lastName \n ? (name + ' ' + lastName).trim() \n : '';\n \n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\n else replaceContent(page.title, i18n('YourName'));\n };\n\n let sendAvatar = () => new Promise<void>((resolve, reject) => {\n if(!uploadAvatar) {\n //console.log('User has not selected avatar');\n return resolve();\n }\n\n //console.log('invoking uploadFile...');\n uploadAvatar().then((inputFile) => {\n //console.log('uploaded smthn', inputFile);\n \n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\n }, reject);\n });\n\n const nameInputField = new InputField({\n label: 'FirstName',\n maxLength: 70\n });\n\n const lastNameInputField = new InputField({\n label: 'LastName',\n maxLength: 64\n });\n\n const btnSignUp = Button('btn-primary btn-color-primary');\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\n btnSignUp.append(btnI18n.element);\n\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\n\n nameInputField.input.addEventListener('input', handleInput);\n lastNameInputField.input.addEventListener('input', handleInput);\n\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\n return false;\n }\n\n if(!nameInputField.value.length) {\n nameInputField.input.classList.add('error');\n return false;\n }\n\n this.disabled = true;\n\n const name = nameInputField.value.trim();\n const lastName = lastNameInputField.value.trim();\n\n const params = {\n phone_number: authCode.phone_number,\n phone_code_hash: authCode.phone_code_hash,\n first_name: name,\n last_name: lastName\n };\n\n //console.log('invoking auth.signUp with params:', params);\n\n btnI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(this);\n\n apiManager.invokeApi('auth.signUp', params)\n .then((response) => {\n //console.log('auth.signUp response:', response);\n \n switch(response._) {\n case 'auth.authorization': // success\n apiManager.setUserAuth(response.user.id);\n\n sendAvatar().finally(() => {\n pageIm.mount();\n });\n \n break;\n default:\n btnI18n.update({key: response._ as any});\n this.removeAttribute('disabled');\n preloader.remove();\n break;\n }\n\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\n pageAuthCode(Object.assign(code, {phoneNumber})); */\n }).catch(err => {\n this.removeAttribute('disabled');\n preloader.remove();\n\n switch(err.type) {\n default:\n btnI18n.update({key: err.type});\n break;\n }\n });\n });\n\n blurActiveElement();\n return new Promise((resolve) => {\n window.requestAnimationFrame(resolve);\n });\n});\n\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\n authCode = _authCode;\n\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\n appStateManager.saveState();\n});\n\nexport default page;\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 mediaSizes from '../helpers/mediaSizes';\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\nimport appStateManager from '../lib/appManagers/appStateManager';\nimport apiManager from '../lib/mtproto/mtprotoworker';\nimport Page from './page';\nimport pageIm from './pageIm';\nimport pagePassword from './pagePassword';\nimport pageSignIn from './pageSignIn';\nimport pageSignUp from './pageSignUp';\nimport TrackingMonkey from '../components/monkeys/tracking';\nimport CodeInputField from '../components/codeInputField';\nimport { replaceContent } from '../helpers/dom';\nimport { i18n, LangPackKey } from '../lib/langPack';\nimport { randomLong } from '../helpers/random';\n\nlet authCode: AuthSentCode.authSentCode = null;\n\nlet headerElement: HTMLHeadElement = null;\nlet sentTypeElement: HTMLParagraphElement = null;\nlet codeInput: HTMLInputElement;\n\nlet onFirstMount = (): Promise<any> => {\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\n\n const codeInputField = new CodeInputField({\n label: 'Code',\n name: randomLong(),\n length: CODELENGTH,\n onFill: (code) => {\n submitCode('' + code);\n }\n });\n\n codeInput = codeInputField.input as HTMLInputElement;\n\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\n\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\n\n editButton.addEventListener('click', function() {\n return pageSignIn.mount();\n });\n\n const cleanup = () => {\n setTimeout(() => {\n monkey.remove();\n }, 300);\n };\n\n const submitCode = (code: string) => {\n codeInput.setAttribute('disabled', 'true');\n\n const params: AuthSignIn = {\n phone_number: authCode.phone_number,\n phone_code_hash: authCode.phone_code_hash,\n phone_code: code\n };\n\n //console.log('invoking auth.signIn with params:', params);\n\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\n .then((response) => {\n //console.log('auth.signIn response:', response);\n \n switch(response._) {\n case 'auth.authorization':\n apiManager.setUserAuth(response.user.id);\n\n pageIm.mount();\n cleanup();\n break;\n case 'auth.authorizationSignUpRequired':\n //console.log('Registration needed!');\n\n pageSignUp.mount({\n 'phone_number': authCode.phone_number,\n 'phone_code_hash': authCode.phone_code_hash\n });\n\n cleanup();\n break;\n /* default:\n codeInput.innerText = response._;\n break; */\n }\n }).catch(async(err) => {\n let good = false;\n switch(err.type) {\n case 'SESSION_PASSWORD_NEEDED':\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\n good = true;\n err.handled = true;\n await pagePassword.mount();\n setTimeout(() => {\n codeInput.value = '';\n }, 300);\n break;\n case 'PHONE_CODE_EXPIRED':\n codeInput.classList.add('error');\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\n break;\n case 'PHONE_CODE_EMPTY':\n case 'PHONE_CODE_INVALID':\n codeInput.classList.add('error');\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\n break;\n default:\n codeInputField.label.innerText = err.type;\n break;\n }\n\n if(!good) {\n codeInputField.select();\n }\n\n codeInput.removeAttribute('disabled');\n });\n };\n\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new TrackingMonkey(codeInputField, size);\n imageDiv.append(monkey.container);\n return monkey.load();\n};\n\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\n authCode = _authCode;\n\n if(!headerElement) {\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\n } else {\n codeInput.value = '';\n\n const evt = document.createEvent('HTMLEvents');\n evt.initEvent('input', false, true);\n codeInput.dispatchEvent(evt);\n }\n\n headerElement.innerText = authCode.phone_number;\n let key: LangPackKey, args: any[];\n switch(authCode.type._) {\n case 'auth.sentCodeTypeSms':\n key = 'Login.Code.SentSms';\n break;\n case 'auth.sentCodeTypeApp': \n key = 'Login.Code.SentInApp';\n break;\n case 'auth.sentCodeTypeCall': \n key = 'Login.Code.SentCall';\n break;\n default:\n key = 'Login.Code.SentUnknown';\n args = [authCode.type._];\n break;\n }\n\n replaceContent(sentTypeElement, i18n(key, args));\n\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\n appStateManager.saveState();\n}, () => {\n codeInput.focus();\n});\n\nexport default page;\n"],"sourceRoot":""}