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

1 line
138 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///./src/components/button.ts","webpack:///./src/components/inputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/pages/pageIm.ts","webpack:///./src/helpers/dom/findUpTag.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/pageSignIn.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/pageAuthCode.ts"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","init","addEventListener","e","target","hasAttribute","parentElement","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","_","wrapRichText","noLinks","wrappingDraft","window","execCommand","checkAndSetRTL","input","char","HTMLInputElement","value","innerText","direction","style","InputState","this","container","maxLength","showLengthOn","Math","round","placeholder","name","plainText","processInput","label","labelText","innerHTML","firstElementChild","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","wasInputFakeClientHeight","showScrollDebounced","remove","undefined","border","setLabel","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","length","diff","isError","toggle","select","textContent","labelOptions","scrollHeight","clientHeight","height","setValueSilently","event","Event","bubbles","cancelable","dispatchEvent","fireFakeInput","originalValue","silent","wrapDraftText","state","Error","Valid","setState","rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","r","handler","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","width","x","y","isRippleUnneeded","includes","tagName","touchEnd","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","dataset","ScrollableBase","el","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","log","error","Array","from","children","forEach","c","onScroll","capture","cancelAnimationFrame","element","position","margin","maxDistance","forceDirection","forceDuration","axis","Scrollable","onScrollOffset","withPaddingContainer","super","onAdditionalScroll","onScrolledTop","onScrolledBottom","lastScrollTop","lastScrollDirection","loadedAll","bottom","splitUp","scrollTop","checkForTriggers","maxScrollTop","setListeners","elements","padding","offsetHeight","getDistanceToEnd","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","toggleDisability","span","type","id","checked","stateKey","getState","then","stateValue","stateValues","indexOf","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","disable","PopupElement","buttons","header","title","onEscape","hide","back","destroy","onClose","btnClose","overlayIsActive","removeItem","navigationItem","onCloseAfterTimeout","checkAnimations","closable","overlayClosable","onOverlayClick","withConfirm","btnConfirm","body","buttonsDiv","buttonsElements","map","b","isDanger","langKey","langArgs","isCancel","onPop","pushItem","offsetWidth","addCancelButton","find","push","page","pushToState","m","default","broadcast","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","finally","findUpTag","tag","closest","passwordManager","invokeApi","result","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","code","LoginPage","imageDiv","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","PasswordInputField","passwordVisible","onVisibilityClick","toggleVisible","onVisibilityClickAdditional","autocomplete","stealthy","tabIndex","insertBefore","cloneNode","nextSibling","PasswordMonkey","passwordInputField","needFrame","loadPromise","loadAnimationFromURL","loop","autoplay","noCache","_animation","animation","currentFrame","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","originalImage","canvas","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","draggable","Image","src","overlayColor","appendChild","parentNode","maxWidth","naturalWidth","CROPWIDTH","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","imgZoom","zoom","PI","right","newWidth","floor","newHeight","w","h","offsetLeft","offsetTop","String","fromCharCode","charCode","container_width","container_height","container_left","container_top","mouse_x","pageX","scrollX","mouse_y","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","onload","crop","getContext","drawImage","removeHandlers","image","cropper","h6","cropContainer","display","file","files","reader","FileReader","contents","show","readAsDataURL","btnSubmit","click","toBlob","blob","darkenCanvas","onCrop","appDownloadManager","upload","postCanvas","ctx","fillStyle","fillRect","passwordInput","btnNext","btnNextI18n","IntlElement","key","getStateInterval","setInterval","_state","wrapEmojiText","onSubmit","update","preloader","check","response","clearInterval","mount","monkey","removeAttribute","catch","err","isMobile","load","focus","saveState","TrackingMonkey","inputField","playAnimation","frame","min","idleAnimation","stop","CodeInputField","lastLength","slice","onFill","btnQr","test","phoneCode","emoji","pattern","console","countries","sort","a","localeCompare","lastCountrySelected","countryInputField","countryInput","selectWrapper","arrowDown","selectList","initSelect","liArr","split","li","spanEmoji","kek","outerHTML","selectCountryByTarget","countryName","childNodes","telEl","lastValue","hidePicker","hideTimeout","clearTimeout","pageEl","mouseDownHandlerAttached","onMouseDown","ctrlKey","_value","toLowerCase","matches","good","blur","pasted","telInputField","loadLottieWorkers","formatted","country","o","visibility","metaKey","shiftKey","signedCheckboxField","keepSigned","toggleStorage","phone_number","api_id","api_hash","hash","Object","assign","setError","qrMounted","promise","preloaderDiv","module","h4","config","suggested_lang_code","lastRequestedLangCode","getStrings","res","backup","string","backupString","strings","get","btnChangeLanguage","nearestDcResult","dcs","done","this_dc","nearest_dc","getNetworker","g","dcId","shift","fileDownload","authCode","imported","avatarPreview","addIco","appProfileManager","uploadAvatar","open","_uploadAvatar","handleInput","nameInputField","lastName","lastNameInputField","fullName","trim","btnSignUp","btnI18n","phone_code_hash","first_name","last_name","reject","inputFile","uploadProfilePhoto","_authCode","codeInput","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","phone_code","ignoreErrors","handled","evt","createEvent","initEvent","getElementsByClassName","args","sentCode"],"mappings":"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","file":"8.42666a14653dfd90aba1.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 { i18n, LangPackKey } from \"../lib/langPack\";\nimport { ripple } from \"./ripple\";\n\nconst Button = (className: string, options: Partial<{\n noRipple: true, \n onlyMobile: true, \n icon: string, \n rippleSquare: true, \n text: LangPackKey, \n disabled: boolean,\n asDiv: boolean\n}> = {}) => {\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button;\n};\n\nexport default Button;\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 { getRichValue, isInputEmpty } from \"../helpers/dom\";\nimport { debounce } from \"../helpers/schedulers\";\nimport { checkRTL } from \"../helpers/string\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n if(!(e.target as HTMLElement).hasAttribute('contenteditable') && !(e.target as HTMLElement).parentElement.hasAttribute('contenteditable')) {\n return;\n }\n //console.log('document paste');\n\n //console.log('messageInput paste');\n\n e.preventDefault();\n // @ts-ignore\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\n\n let entities = RichTextProcessor.parseEntities(text);\n //console.log('messageInput paste', text, entities);\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\n //text = RichTextProcessor.wrapEmojiText(text);\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\n\n // console.log('messageInput paste after', text);\n\n // @ts-ignore\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\n\n // @ts-ignore\n //console.log('paste text', text, );\n window.document.execCommand('insertHTML', false, text);\n });\n\n init = null;\n};\n\nconst checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n};\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey, \n label?: LangPackKey, \n labelOptions?: any[],\n labelText?: string,\n name?: string, \n maxLength?: number, \n showLengthOn?: number,\n plainText?: true,\n animate?: true\n};\n\nclass InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputFake: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\n protected wasInputFakeClientHeight: number;\n protected showScrollDebounced: () => void;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n if(options.maxLength) {\n options.showLengthOn = Math.round(options.maxLength / 3);\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\n\n let label = options.label || options.labelText;\n\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `\n <div contenteditable=\"true\" class=\"input-field-input\"></div>\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n const observer = new MutationObserver(() => {\n checkAndSetRTL(input);\n\n if(processInput) {\n processInput();\n }\n });\n\n // * because if delete all characters there will br left\n input.addEventListener('input', () => {\n if(isInputEmpty(input)) {\n input.innerHTML = '';\n }\n\n if(this.inputFake) {\n this.inputFake.innerHTML = input.innerHTML;\n this.onFakeInput();\n }\n });\n \n // ! childList for paste first symbol\n observer.observe(input, {characterData: true, childList: true, subtree: true});\n\n if(options.animate) {\n input.classList.add('scrollable', 'scrollable-y');\n this.wasInputFakeClientHeight = 0;\n this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n this.inputFake.setAttribute('contenteditable', 'true');\n this.inputFake.className = input.className + ' input-field-input-fake';\n }\n } else {\n this.container.innerHTML = `\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n\n if(this.inputFake) {\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\n }\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n let processInput: () => void;\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n processInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input)].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n input.addEventListener('input', processInput);\n }\n\n this.input = input;\n }\n\n public select() {\n if((this.input as HTMLInputElement).value) { // * avoid selecting whole empty field on iOS devices\n (this.input as HTMLInputElement).select(); // * select text\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n this.label.innerHTML = this.options.labelText;\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n public onFakeInput() {\n const {scrollHeight, clientHeight} = this.inputFake;\n if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n }\n\n this.wasInputFakeClientHeight = clientHeight;\n this.input.style.height = scrollHeight ? scrollHeight + 'px' : '';\n }\n\n get value() {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input);\n //return getRichValue(this.input);\n }\n\n set value(value: string) {\n this.setValueSilently(value, false);\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(value: string, fireFakeInput = true) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value;\n } else {\n this.input.innerHTML = value;\n \n if(this.inputFake) {\n this.inputFake.innerHTML = value;\n\n if(fireFakeInput) {\n this.onFakeInput();\n }\n }\n }\n }\n\n public isValid() {\n return !this.input.classList.contains('error') && this.value !== this.originalValue;\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\n this.originalValue = value;\n\n if(!this.options.plainText) {\n value = RichTextProcessor.wrapDraftText(value);\n }\n\n if(silent) {\n this.setValueSilently(value, false); \n } else {\n this.value = value;\n }\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n\nexport default InputField;\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 findUpClassName from \"../helpers/dom/findUpClassName\";\nimport sequentialDom from \"../helpers/sequentialDom\";\nimport {isTouchSupported} from \"../helpers/touchSupport\";\nimport rootScope from \"../lib/rootScope\";\n\nlet rippleClickId = 0;\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\n //return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n \n let r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n //let animationEndPromise: Promise<number>;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const elem = document.createElement('div');\n\n const clickId = rippleClickId++;\n \n //console.log('ripple drawRipple');\n \n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\n //console.log('ripple duration', duration);\n\n handler = () => {\n //handler = () => animationEndPromise.then((duration) => {\n //console.log('ripple animation was:', duration);\n\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n //return;\n let elapsedTime = Date.now() - startTime;\n const cb = () => {\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n elem.remove();\n });\n \n if(onEnd) onEnd(clickId);\n };\n if(elapsedTime < duration) {\n let delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n elem.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!isTouchSupported) {\n window.removeEventListener('contextmenu', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n //});\n\n callback && callback(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n \n //console.log('ripple after promise', Date.now() - startTime);\n //console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n window.requestAnimationFrame(() => {\n const rect = r.getBoundingClientRect();\n elem.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n elem.style.width = elem.style.height = size + 'px';\n elem.style.left = x + 'px';\n elem.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n \n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(elem);\n\n //r.classList.add('active');\n //handler();\n });\n //});\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(isTouchSupported) {\n let touchEnd = () => {\n handler && handler();\n };\n \n elem.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n //console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n \n //console.log('touchstart', e);\n touchStartFired = true;\n \n let {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n elem.addEventListener('touchend', touchEnd, {once: true});\n \n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n elem.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n elem.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n \n let {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\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 { isTouchSupported } from \"../helpers/touchSupport\";\nimport { logger, LogLevels } from \"../lib/logger\";\nimport fastSmoothScroll, { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\nimport { cancelEvent } from \"../helpers/dom\";\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\n\t//_el.style.display = '';\t\n\t//return;\n\n\tlet el = _el.parentElement;\n\tlet height = el.scrollHeight;\n\tlet width = el.scrollWidth;\n\tel.style.width = width + 'px';\n\tel.style.height = height + 'px';\n\t_el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map<HTMLElement, Scrollable> = new Map();\nconst scrollsIntersector = new IntersectionObserver(entries => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nexport class ScrollableBase {\n protected log: ReturnType<typeof logger>;\n\n public onScrollMeasure: number = 0;\n protected onScroll: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogLevels.error);\n\n if(el) {\n Array.from(el.children).forEach(c => this.container.append(c));\n\n el.append(this.container);\n }\n //this.onScroll();\n }\n\n protected setListeners() {\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.needCheckAfterAnimation = true;\n window.cancelAnimationFrame(this.onScrollMeasure);\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public append(element: HTMLElement) {\n this.container.append(element);\n }\n\n public scrollIntoViewNew(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y'\n ) {\n //return Promise.resolve();\n return fastSmoothScroll(this.container, element, position, margin, maxDistance, forceDirection, forceDuration, axis);\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public splitUp: HTMLElement;\n public padding: HTMLElement;\n \n public onAdditionalScroll: () => void = null;\n public onScrolledTop: () => void = null;\n public onScrolledBottom: () => void = null;\n \n public lastScrollTop: number = 0;\n public lastScrollDirection: number = 0;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach(c => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public onScroll = () => {\n //if(this.debug) {\n //this.log('onScroll call', this.onScrollMeasure);\n //}\n\n //return;\n\n if(this.isHeavyAnimationInProgress) {\n if(this.onScrollMeasure) {\n window.cancelAnimationFrame(this.onScrollMeasure);\n }\n\n this.needCheckAfterAnimation = true;\n return;\n }\n\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = 0;\n\n const scrollTop = this.container.scrollTop;\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollTop = scrollTop;\n\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\n this.onAdditionalScroll();\n }\n \n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n });\n };\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollTop;\n\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: HTMLElement[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: HTMLElement[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n \n get scrollTop() {\n //this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n \n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!isTouchSupported) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n \n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\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 appStateManager from \"../lib/appManagers/appStateManager\";\nimport { getDeepProperty } from \"../helpers/object\";\nimport { ripple } from \"./ripple\";\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string, \n round?: boolean, \n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n appStateManager.getState().then(state => {\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n\n input.addEventListener('change', () => {\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n appStateManager.setByKey(options.stateKey, value);\n });\n });\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n \n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n \n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n \n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n \n box.append(border, bg, checkSvg);\n \n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n //label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\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 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\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag) \n return el;\n }\n return null; */\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 * 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 { formatPhoneNumber, putPreloader } from \"../components/misc\";\nimport Scrollable from '../components/scrollable';\nimport Countries, { Country as _Country } from \"../countries\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport { RichTextProcessor } from '../lib/richtextprocessor';\nimport { attachClickEvent, cancelEvent, replaceContent, toggleDisability } from \"../helpers/dom\";\nimport Page from \"./page\";\nimport InputField from \"../components/inputField\";\nimport CheckboxField from \"../components/checkboxField\";\nimport Button from \"../components/button\";\nimport { isAppleMobile } from \"../helpers/userAgent\";\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\nimport { isTouchSupported } from \"../helpers/touchSupport\";\nimport App from \"../config/app\";\nimport Modes from \"../config/modes\";\nimport I18n, { _i18n, i18n, LangPackKey } from \"../lib/langPack\";\nimport { LangPackString } from \"../layer\";\nimport lottieLoader from \"../lib/lottieLoader\";\nimport { ripple } from \"../components/ripple\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { randomLong } from \"../helpers/random\";\nimport AppStorage from \"../lib/storage\";\nimport CacheStorageController from \"../lib/cacheStorage\";\n\ntype Country = _Country & {\n li?: HTMLLIElement[]\n};\n\n//import _countries from '../countries_pretty.json';\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\n\nlet onFirstMount = () => {\n if(Modes.test) {\n Countries.push({\n name: 'Test Country',\n phoneCode: '999 66',\n code: 'TC',\n emoji: '🤔',\n pattern: '999 66 XXX XX'\n });\n \n console.log('Added test country to list!');\n }\n\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\n const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\n\n let lastCountrySelected: Country = null;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const countryInputField = new InputField({\n label: 'Login.CountrySelectorLabel',\n name: randomLong(),\n plainText: true\n });\n\n countryInputField.container.classList.add('input-select');\n\n const countryInput = countryInputField.input as HTMLInputElement;\n countryInput.autocomplete = randomLong();\n\n const selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n countryInputField.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n const emoji = c.emoji;\n\n const liArr: Array<HTMLLIElement> = [];\n c.phoneCode.split(' and ').forEach((phoneCode: string) => {\n const li = document.createElement('li');\n const spanEmoji = document.createElement('span');\n\n const kek = RichTextProcessor.wrapRichText(emoji);\n\n li.appendChild(spanEmoji);\n spanEmoji.outerHTML = kek;\n \n li.append(c.name);\n\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + phoneCode;\n li.appendChild(span);\n\n liArr.push(li);\n selectList.append(li);\n });\n\n c.li = liArr;\n });\n \n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n \n let target = e.target as HTMLElement;\n if(target.tagName !== 'LI') target = findUpTag(target, 'LI');\n \n selectCountryByTarget(target);\n //console.log('clicked', e, countryName, phoneCode);\n });\n\n countryInputField.container.appendChild(selectWrapper);\n };\n\n const selectCountryByTarget = (target: HTMLElement) => {\n const countryName = target.childNodes[1].textContent;//target.innerText.split('\\n').shift();\n const phoneCode = target.querySelector<HTMLElement>('.phone-code').innerText;\n\n countryInput.value = countryName;\n lastCountrySelected = countries.find(c => c.name === countryName);\n \n telEl.value = lastValue = phoneCode;\n hidePicker();\n setTimeout(() => telEl.focus(), 0);\n };\n \n initSelect();\n\n let hideTimeout: number;\n\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n c.li.forEach(li => li.style.display = '');\n });\n }\n\n clearTimeout(hideTimeout);\n hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n countryInputField.select();\n\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === countryInput) {\n return;\n }\n\n hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n const hidePicker = () => {\n if(hideTimeout !== undefined) return;\n selectWrapper.classList.remove('active');\n hideTimeout = window.setTimeout(() => {\n selectWrapper.classList.add('hide');\n hideTimeout = undefined;\n }, 200);\n };\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\n hidePicker();\n \n e.cancelBubble = true;\n }, {capture: true}); */\n\n countryInput.addEventListener('keyup', function(this: typeof countryInput, e) {\n if(e.ctrlKey || e.key === 'Control') return false;\n\n //let i = new RegExp('^' + this.value, 'i');\n let _value = this.value.toLowerCase();\n let matches: Country[] = [];\n countries.forEach((c) => {\n let good = c.name.toLowerCase().indexOf(_value) !== -1/* === 0 */;//i.test(c.name);\n\n c.li.forEach(li => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n c.li.forEach(li => li.style.display = '');\n });\n } else if(matches.length === 1 && e.key === 'Enter') {\n selectCountryByTarget(matches[0].li[0]);\n }\n });\n\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\n e.cancelBubble = true;\n e.preventDefault();\n if(countryInput.matches(':focus')) countryInput.blur();\n else countryInput.focus();\n });\n\n let pasted = false;\n let lastValue = '';\n \n const telInputField = new InputField({\n label: 'Login.PhoneLabel',\n plainText: true,\n name: 'phone'\n });\n let telEl = telInputField.input as HTMLInputElement;\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n telEl.addEventListener('input', function(this: typeof telEl, e) {\n //console.log('input', this.value);\n this.classList.remove('error');\n\n lottieLoader.loadLottieWorkers();\n\n const value = this.value;\n const diff = Math.abs(value.length - lastValue.length);\n if(diff > 1 && !pasted && isAppleMobile) {\n this.value = lastValue + value;\n }\n\n pasted = false;\n\n telInputField.setLabel();\n\n let formatted: string, country: Country;\n if(this.value.replace(/\\++/, '+') === '+') {\n this.value = '+';\n } else {\n const o = formatPhoneNumber(this.value);\n formatted = o.formatted;\n country = o.country;\n this.value = lastValue = formatted ? '+' + formatted : '';\n }\n\n //console.log(formatted, country);\n\n let countryName = country ? country.name : ''/* 'Unknown' */;\n if(countryName !== countryInput.value && (!lastCountrySelected || !country || lastCountrySelected.phoneCode !== country.phoneCode)) {\n countryInput.value = countryName;\n lastCountrySelected = country;\n }\n\n //if(country && (this.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\n if(country || (this.value.length - 1) > 1) {\n btnNext.style.visibility = '';\n } else {\n btnNext.style.visibility = 'hidden';\n }\n });\n\n telEl.addEventListener('paste', (e) => {\n pasted = true;\n //console.log('paste', telEl.value);\n });\n\n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n\n telEl.addEventListener('keypress', function(this: typeof telEl, e) {\n //console.log('keypress', this.value);\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\n return onSubmit();\n } else if(/\\D/.test(e.key) && !(e.metaKey || e.ctrlKey) && !(e.key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n\n const signedCheckboxField = new CheckboxField({\n text: 'Login.KeepSigned', \n name: 'keepSession',\n withRipple: true\n });\n\n signedCheckboxField.input.addEventListener('change', () => {\n const keepSigned = signedCheckboxField.checked;\n appStateManager.pushToState('keepSigned', keepSigned);\n \n AppStorage.toggleStorage(keepSigned);\n CacheStorageController.toggleStorage(keepSigned);\n apiManager.toggleStorage(keepSigned);\n });\n\n appStateManager.getState().then(state => {\n signedCheckboxField.checked = state.keepSigned;\n });\n\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\n btnNext.style.visibility = 'hidden';\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\n\n replaceContent(btnNext, i18n('PleaseWait'));\n putPreloader(btnNext);\n\n //return;\n\n let phone_number = telEl.value;\n apiManager.invokeApi('auth.sendCode', {\n phone_number: phone_number,\n api_id: App.id,\n api_hash: App.hash,\n settings: {\n _: 'codeSettings' // that's how we sending Type\n }\n //lang_code: navigator.language || 'en'\n }).then((code) => {\n //console.log('got code', code);\n\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\n }).catch(err => {\n toggle();\n\n switch(err.type) {\n case 'PHONE_NUMBER_INVALID':\n telInputField.setError();\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\n telEl.classList.add('error');\n replaceContent(btnNext, i18n('Login.Next'));\n break;\n default:\n console.error('auth.sendCode error:', err);\n btnNext.innerText = err.type;\n break;\n }\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\n\n let qrMounted = false;\n btnQr.addEventListener('click', () => {\n const promise = import('./pageSignQR');\n btnQr.disabled = true;\n\n let preloaderDiv: HTMLElement;\n if(!qrMounted) {\n preloaderDiv = putPreloader(btnQr);\n qrMounted = true;\n }\n\n promise.then(module => {\n module.default.mount();\n\n setTimeout(() => {\n btnQr.removeAttribute('disabled');\n if(preloaderDiv) {\n preloaderDiv.remove();\n }\n }, 200);\n });\n });\n\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.Title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n _i18n(subtitle, 'Login.StartText');\n\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\n\n let tryAgain = () => {\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\n const dcs = [1, 2, 3, 4, 5];\n const done: number[] = [nearestDcResult.this_dc];\n\n let promise: Promise<any>;\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\n done.push(nearestDcResult.nearest_dc)\n });\n }\n\n (promise || Promise.resolve()).then(() => {\n const g = () => {\n const dcId = dcs.shift();\n if(!dcId) return;\n\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\n apiManager.getNetworker(dcId, {fileDownload: true}).finally(g);\n }, done.includes(dcId) ? 0 : 3000);\n };\n \n g();\n });\n \n return nearestDcResult;\n }).then((nearestDcResult) => {\n let country = countries.find((c) => c.code === nearestDcResult.country);\n if(country) {\n if(!countryInput.value.length && !telEl.value.length) {\n countryInput.value = country.name;\n lastCountrySelected = country;\n telEl.value = lastValue = '+' + country.phoneCode.split(' and ').shift();\n }\n }\n \n //console.log('woohoo', nearestDcResult, country);\n })//.catch(tryAgain);\n };\n\n if(!isTouchSupported) {\n setTimeout(() => {\n telEl.focus();\n }, 0);\n }\n\n apiManager.invokeApi('help.getConfig').then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n Promise.all([\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]).then(res => {\n const backup: LangPackString[] = [];\n res[0].forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n inputWrapper.append(btnChangeLanguage);\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code).then(() => {\n btnChangeLanguage.remove();\n });\n });\n });\n }\n });\n\n tryAgain();\n};\n\nconst page = new Page('page-sign', true, onFirstMount, () => {\n if(btnNext) {\n replaceContent(btnNext, i18n('Login.Next'));\n ripple(btnNext, undefined, undefined, true);\n btnNext.removeAttribute('disabled');\n }\n\n if(btnQr) {\n btnQr.removeAttribute('disabled');\n }\n\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\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 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":""}