1 line
138 KiB
Plaintext
1 line
138 KiB
Plaintext
{"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":""} |