1 line
144 KiB
Plaintext
1 line
144 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/pages/pageIm.ts","webpack:///./src/components/popups/index.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/pages/pagePassword.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.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","page","pushToState","m","default","broadcast","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","finally","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","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","passwordInput","btnNext","btnNextI18n","IntlElement","key","getStateInterval","setInterval","_state","wrapEmojiText","onSubmit","update","preloader","check","response","clearInterval","mount","monkey","removeAttribute","catch","err","isMobile","load","focus","saveState","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","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","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","TrackingMonkey","inputField","playAnimation","frame","min","idleAnimation","stop","CodeInputField","lastLength","slice","onFill","codeInput","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","phone_code","ignoreErrors","handled","evt","createEvent","initEvent","getElementsByClassName","args","sentCode"],"mappings":"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","file":"9.c0011f438a598fceb68a.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}> = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getRichValue, isInputEmpty } from \"../helpers/dom\";\r\nimport { debounce } from \"../helpers/schedulers\";\r\nimport { checkRTL } from \"../helpers/string\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!(e.target as HTMLElement).hasAttribute('contenteditable') && !(e.target as HTMLElement).parentElement.hasAttribute('contenteditable')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\nconst checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n};\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n protected wasInputFakeClientHeight: number;\r\n protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n if(options.maxLength) {\r\n options.showLengthOn = Math.round(options.maxLength / 3);\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n <div contenteditable=\"true\" class=\"input-field-input\"></div>\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n this.wasInputFakeClientHeight = 0;\r\n this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input)].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if((this.input as HTMLInputElement).value) { // * avoid selecting whole empty field on iOS devices\r\n (this.input as HTMLInputElement).select(); // * select text\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput() {\r\n const {scrollHeight, clientHeight} = this.inputFake;\r\n if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n }\r\n\r\n this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.height = scrollHeight ? scrollHeight + 'px' : '';\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input);\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n const event = new Event('input', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && this.value !== this.originalValue;\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {isTouchSupported} from \"../helpers/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise<number>;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!isTouchSupported) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(isTouchSupported) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { isTouchSupported } from \"../helpers/touchSupport\";\r\nimport { logger, LogLevels } from \"../lib/logger\";\r\nimport fastSmoothScroll, { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map<HTMLElement, Scrollable> = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType<typeof logger>;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogLevels.error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y'\r\n ) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll(this.container, element, position, margin, maxDistance, forceDirection, forceDuration, axis);\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void = null;\r\n public onScrolledTop: () => void = null;\r\n public onScrolledBottom: () => void = null;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: HTMLElement[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: HTMLElement[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!isTouchSupported) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","//import {stackBlurImage} from '../lib/StackBlur';\r\n//import appStateManager from \"../lib/appManagers/appStateManager\";\r\n/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { blurActiveElement } from \"../helpers/dom\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n import('../lib/rootScope').then(m => {\r\n m.default.broadcast('im_mount');\r\n });\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n blurActiveElement();\r\n return new Promise<void>((resolve) => {\r\n window.requestAnimationFrame(() => {\r\n const promise = import('../lib/appManagers/appDialogsManager');\r\n promise.finally(async() => {\r\n //alert('pageIm!');\r\n resolve();\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n \r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n \r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n });\r\n });\r\n });\r\n\r\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\r\n /* fetch('assets/img/camomile.jpg')\r\n .then(res => res.blob())\r\n .then(blob => {\r\n let img = new Image();\r\n let url = URL.createObjectURL(blob);\r\n img.src = url;\r\n img.onload = () => {\r\n let id = 'chat-background-canvas';\r\n var canvas = document.getElementById(id) as HTMLCanvasElement;\r\n //URL.revokeObjectURL(url);\r\n \r\n let elements = ['.chat-container'].map(selector => {\r\n return document.querySelector(selector) as HTMLDivElement;\r\n });\r\n \r\n stackBlurImage(img, id, 15, 0);\r\n \r\n canvas.toBlob(blob => {\r\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\r\n let dataUrl = URL.createObjectURL(blob);\r\n \r\n elements.forEach(el => {\r\n el.style.backgroundImage = 'url(' + dataUrl + ')';\r\n });\r\n }, 'image/jpeg', 1);\r\n };\r\n }); */\r\n //});\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { blurActiveElement } from \"../../helpers/dom\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true\r\n}>;\r\n\r\nexport default class PopupElement {\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLElement;\r\n protected body: HTMLElement;\r\n\r\n protected onClose: () => void;\r\n protected onCloseAfterTimeout: () => void;\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(className: string, buttons?: Array<PopupButton>, options: PopupOptions = {}) {\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n this.btnClose.addEventListener('click', this.hide, {once: true});\r\n }\r\n\r\n if(options.overlayClosable) {\r\n const onOverlayClick = (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n this.element.removeEventListener('click', onOverlayClick);\r\n }\r\n };\r\n \r\n this.element.addEventListener('click', onOverlayClick);\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n if(buttons && buttons.length) {\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n\r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n if(b.callback) {\r\n button.addEventListener('click', () => {\r\n b.callback();\r\n this.destroy();\r\n }, {once: true});\r\n } else if(b.isCancel) {\r\n button.addEventListener('click', () => {\r\n this.destroy();\r\n }, {once: true});\r\n }\r\n \r\n return button;\r\n });\r\n \r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n document.body.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n rootScope.overlayIsActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.back('popup');\r\n };\r\n\r\n private destroy = () => {\r\n this.onClose && this.onClose();\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n\r\n if(this.btnClose) this.btnClose.removeEventListener('click', this.hide);\r\n rootScope.overlayIsActive = false;\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.onCloseAfterTimeout && this.onCloseAfterTimeout();\r\n animationIntersector.checkAnimations(false);\r\n }, 150);\r\n };\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport appUsersManager from '../appManagers/appUsersManager';\r\nimport apiManager from './mtprotoworker';\r\n//import { computeCheck } from \"../crypto/srp\";\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise<AccountPassword> {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\r\n let newHashPromise: Promise<Uint8Array>;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n appUsersManager.saveApiUser(auth.user);\r\n apiManager.setUserAuth(auth.user.id);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: Promise<void>;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport pageIm from './pageIm';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { attachClickEvent, cancelEvent, htmlToSpan, replaceContent, toggleDisability } from '../helpers/dom';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise<any> => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n pageIm.mount();\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n appStateManager.saveState();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { ripple } from \"../ripple\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private btnSubmit: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType<typeof appDownloadManager.upload>) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.input.addEventListener('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n \r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const contents = e.target.result as string;\r\n \r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n };\r\n \r\n reader.readAsDataURL(file);\r\n }, false);\r\n\r\n this.btnSubmit = document.createElement('button');\r\n this.btnSubmit.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n ripple(this.btnSubmit);\r\n this.btnSubmit.addEventListener('click', () => {\r\n this.cropper.crop();\r\n this.btnClose.click();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n });\r\n\r\n this.container.append(this.cropContainer, this.btnSubmit, this.input);\r\n\r\n this.onCloseAfterTimeout = () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n };\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { formatPhoneNumber, putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Countries, { Country as _Country } from \"../countries\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport { attachClickEvent, cancelEvent, replaceContent, toggleDisability } from \"../helpers/dom\";\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport { isAppleMobile } from \"../helpers/userAgent\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { isTouchSupported } from \"../helpers/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport Modes from \"../config/modes\";\r\nimport I18n, { _i18n, i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { LangPackString } from \"../layer\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\n\r\ntype Country = _Country & {\r\n li?: HTMLLIElement[]\r\n};\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n if(Modes.test) {\r\n Countries.push({\r\n name: 'Test Country',\r\n phoneCode: '999 66',\r\n code: 'TC',\r\n emoji: '🤔',\r\n pattern: '999 66 XXX XX'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n }\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n let lastCountrySelected: Country = null;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong(),\r\n plainText: true\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input as HTMLInputElement;\r\n countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = c.emoji;\r\n\r\n const liArr: Array<HTMLLIElement> = [];\r\n c.phoneCode.split(' and ').forEach((phoneCode: string) => {\r\n const li = document.createElement('li');\r\n const spanEmoji = document.createElement('span');\r\n\r\n const kek = RichTextProcessor.wrapRichText(emoji);\r\n\r\n li.appendChild(spanEmoji);\r\n spanEmoji.outerHTML = kek;\r\n \r\n li.append(c.name);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + phoneCode;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n c.li = liArr;\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n let target = e.target as HTMLElement;\r\n if(target.tagName !== 'LI') target = findUpTag(target, 'LI');\r\n \r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const countryName = target.childNodes[1].textContent;//target.innerText.split('\\n').shift();\r\n const phoneCode = target.querySelector<HTMLElement>('.phone-code').innerText;\r\n\r\n countryInput.value = countryName;\r\n lastCountrySelected = countries.find(c => c.name === countryName);\r\n \r\n telEl.value = lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => telEl.focus(), 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n c.li.forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', function(this: typeof countryInput, e) {\r\n if(e.ctrlKey || e.key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = this.value.toLowerCase();\r\n let matches: Country[] = [];\r\n countries.forEach((c) => {\r\n let good = c.name.toLowerCase().indexOf(_value) !== -1/* === 0 */;//i.test(c.name);\r\n\r\n c.li.forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n c.li.forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && e.key === 'Enter') {\r\n selectCountryByTarget(matches[0].li[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n let pasted = false;\r\n let lastValue = '';\r\n \r\n const telInputField = new InputField({\r\n label: 'Login.PhoneLabel',\r\n plainText: true,\r\n name: 'phone'\r\n });\r\n let telEl = telInputField.input as HTMLInputElement;\r\n telEl.type = 'tel';\r\n telEl.autocomplete = 'rr55RandomRR55';\r\n telEl.addEventListener('input', function(this: typeof telEl, e) {\r\n //console.log('input', this.value);\r\n this.classList.remove('error');\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const value = this.value;\r\n const diff = Math.abs(value.length - lastValue.length);\r\n if(diff > 1 && !pasted && isAppleMobile) {\r\n this.value = lastValue + value;\r\n }\r\n\r\n pasted = false;\r\n\r\n telInputField.setLabel();\r\n\r\n let formatted: string, country: Country;\r\n if(this.value.replace(/\\++/, '+') === '+') {\r\n this.value = '+';\r\n } else {\r\n const o = formatPhoneNumber(this.value);\r\n formatted = o.formatted;\r\n country = o.country;\r\n this.value = lastValue = formatted ? '+' + formatted : '';\r\n }\r\n\r\n //console.log(formatted, country);\r\n\r\n let countryName = country ? country.name : ''/* 'Unknown' */;\r\n if(countryName !== countryInput.value && (!lastCountrySelected || !country || lastCountrySelected.phoneCode !== country.phoneCode)) {\r\n countryInput.value = countryName;\r\n lastCountrySelected = country;\r\n }\r\n\r\n //if(country && (this.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (this.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n });\r\n\r\n telEl.addEventListener('paste', (e) => {\r\n pasted = true;\r\n //console.log('paste', telEl.value);\r\n });\r\n\r\n /* telEl.addEventListener('change', (e) => {\r\n console.log('change', telEl.value);\r\n }); */\r\n\r\n telEl.addEventListener('keypress', function(this: typeof telEl, e) {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n } else if(/\\D/.test(e.key) && !(e.metaKey || e.ctrlKey) && !(e.key === '+' && e.shiftKey/* && !this.value */)) {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true\r\n });\r\n signedCheckboxField.input.checked = true;\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telEl.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n });\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const dcs = [1, 2, 3, 4, 5];\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise<any>;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc)\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n const g = () => {\r\n const dcId = dcs.shift();\r\n if(!dcId) return;\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId, {fileDownload: true}).finally(g);\r\n }, done.includes(dcId) ? 0 : 3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n let country = countries.find((c) => c.code === nearestDcResult.country);\r\n if(country) {\r\n if(!countryInput.value.length && !telEl.value.length) {\r\n countryInput.value = country.name;\r\n lastCountrySelected = country;\r\n telEl.value = lastValue = '+' + country.phoneCode.split(' and ').shift();\r\n }\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!isTouchSupported) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n apiManager.invokeApi('help.getConfig').then(config => {\r\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\r\n //I18n.loadLangPack(config.suggested_lang_code);\r\n\r\n Promise.all([\r\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\r\n I18n.getCacheLangPack()\r\n ]).then(res => {\r\n const backup: LangPackString[] = [];\r\n res[0].forEach(string => {\r\n const backupString = I18n.strings.get(string.key as LangPackKey);\r\n if(!backupString) {\r\n return;\r\n }\r\n \r\n backup.push(backupString);\r\n I18n.strings.set(string.key as LangPackKey, string);\r\n });\r\n\r\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\r\n inputWrapper.append(btnChangeLanguage);\r\n\r\n backup.forEach(string => {\r\n I18n.strings.set(string.key as LangPackKey, string);\r\n });\r\n \r\n attachClickEvent(btnChangeLanguage, (e) => {\r\n cancelEvent(e);\r\n\r\n btnChangeLanguage.disabled = true;\r\n putPreloader(btnChangeLanguage);\r\n\r\n I18n.getLangPack(config.suggested_lang_code).then(() => {\r\n btnChangeLanguage.remove();\r\n });\r\n });\r\n });\r\n }\r\n });\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n appStateManager.saveState();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport { blurActiveElement, replaceContent } from '../helpers/dom';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport pageIm from './pageIm';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise<InputFile>;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise<void>((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUserAuth(response.user.id);\r\n\r\n sendAvatar().finally(() => {\r\n pageIm.mount();\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n appStateManager.saveState();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise<any>;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'assets/img/TwoFactorSetupMonkeyIdle.tgs').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'assets/img/TwoFactorSetupMonkeyTracking.tgs').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: number) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(+this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageIm from './pageIm';\r\nimport pagePassword from './pagePassword';\r\nimport pageSignIn from './pageSignIn';\r\nimport pageSignUp from './pageSignUp';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { replaceContent } from '../helpers/dom';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise<any> => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode('' + code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUserAuth(response.user.id);\r\n\r\n pageIm.mount();\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n pageSignUp.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await pagePassword.mount();\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n appStateManager.saveState();\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} |