tweb/public/12.99bb4248b30707a03180.chunk.js.map
Eduard Kuzmenko 60a603b5de Build
2021-04-26 18:34:31 +04:00

1 line
66 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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

{"version":3,"sources":["webpack:///./src/components/button.ts","webpack:///./src/components/inputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageIm.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/pages/pageSignUp.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","page","pushToState","then","m","default","broadcast","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","finally","PopupElement","buttons","element","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","type","onPop","pushItem","offsetWidth","addCancelButton","find","push","LoginPage","imageDiv","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","originalImage","canvas","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","draggable","Image","src","overlayColor","appendChild","parentNode","maxWidth","naturalWidth","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","imgZoom","zoom","PI","right","bottom","newWidth","floor","clientWidth","newHeight","w","h","offsetLeft","offsetTop","String","fromCharCode","charCode","deltaY","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","super","image","cropper","h6","cropContainer","display","file","files","reader","FileReader","contents","result","show","readAsDataURL","btnSubmit","click","toBlob","blob","darkenCanvas","onCrop","appDownloadManager","upload","postCanvas","ctx","fillStyle","fillRect","authCode","imported","avatarPreview","id","addIco","appProfileManager","uploadAvatar","open","_uploadAvatar","handleInput","nameInputField","lastName","lastNameInputField","fullName","trim","wrapEmojiText","btnSignUp","btnI18n","IntlElement","key","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","setUserAuth","user","reject","inputFile","uploadProfilePhoto","mount","removeAttribute","catch","err","_authCode","saveState"],"mappings":"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","file":"12.99bb4248b30707a03180.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","//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\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\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 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"],"sourceRoot":""}