1 line
68 KiB
Plaintext
1 line
68 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/helpers/dom/findUpTag.ts","webpack:///./src/pages/pageSignIn.ts"],"names":["className","options","button","document","createElement","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","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","setAttribute","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","touchEnd","settings","animationsEnabled","touches","includes","tagName","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","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","disable","findUpTag","tag","closest","btnQr","btnNext","page","test","push","phoneCode","code","emoji","pattern","console","countries","sort","a","b","localeCompare","lastCountrySelected","inputWrapper","countryInputField","countryInput","autocomplete","selectWrapper","arrowDown","selectList","appendChild","initSelect","liArr","split","li","spanEmoji","kek","outerHTML","selectCountryByTarget","countryName","childNodes","find","telEl","lastValue","hidePicker","focus","hideTimeout","display","clearTimeout","offsetWidth","pageEl","mouseDownHandlerAttached","onMouseDown","ctrlKey","key","_value","toLowerCase","matches","good","indexOf","blur","pasted","telInputField","loadLottieWorkers","formatted","country","o","visibility","metaKey","shiftKey","onSubmit","signedCheckboxField","phone_number","invokeApi","api_id","api_hash","hash","m","default","mount","Object","assign","catch","err","setError","qrMounted","promise","preloaderDiv","module","removeAttribute","h4","subtitle","config","suggested_lang_code","lastRequestedLangCode","all","getStrings","getCacheLangPack","res","backup","string","backupString","strings","get","set","btnChangeLanguage","getLangPack","nearestDcResult","dcs","done","this_dc","nearest_dc","getNetworker","g","dcId","shift","fileDownload","finally","pushToState","saveState"],"mappings":"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","file":"13.5a90edf4a881ad13df5d.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<{noRipple: true, onlyMobile: true, icon: string, rippleSquare: true, text: LangPackKey, disabled: boolean}> = {}) => {\r\n const button = document.createElement('button');\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.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 // 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 \r\n || touchStartFired \r\n || (['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) && e.target !== elem) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r) {\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' || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r || (e.target as HTMLElement).tagName === 'A') {\r\n return false;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return false;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true});\r\n window.addEventListener('contextmenu', handler, {once: true});\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 { 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 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 this.checked = getDeepProperty(state, options.stateKey);\r\n\r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, input.checked);\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","/*\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\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"],"sourceRoot":""} |