1 line
50 KiB
Plaintext
1 line
50 KiB
Plaintext
{"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/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts"],"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","passwordManager","invokeApi","result","getState","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","computeSRP","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","all","hashes","new_password_hash","inputCheckPassword","auth","saveApiUser","user","setUserAuth","id","code","LoginPage","element","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","PasswordInputField","super","passwordVisible","onVisibilityClick","toggleVisible","type","onVisibilityClickAdditional","autocomplete","stealthy","tabIndex","insertBefore","cloneNode","nextSibling","PasswordMonkey","passwordInputField","needFrame","loadPromise","loadAnimationFromURL","loop","autoplay","noCache","_animation","animation","currentFrame","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","passwordInput","btnNext","btnNextI18n","IntlElement","key","getStateInterval","setInterval","_state","wrapEmojiText","onSubmit","update","preloader","check","response","clearInterval","mount","monkey","removeAttribute","catch","err","isMobile","load","focus","saveState"],"mappings":"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","file":"10.b9dbcb9af2c42bffea18.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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport appUsersManager from '../appManagers/appUsersManager';\r\nimport apiManager from './mtprotoworker';\r\n//import { computeCheck } from \"../crypto/srp\";\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise<AccountPassword> {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\r\n let newHashPromise: Promise<Uint8Array>;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n appUsersManager.saveApiUser(auth.user);\r\n apiManager.setUserAuth(auth.user.id);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: Promise<void>;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport pageIm from './pageIm';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { attachClickEvent, cancelEvent, htmlToSpan, replaceContent, toggleDisability } from '../helpers/dom';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise<any> => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n pageIm.mount();\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n appStateManager.saveState();\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} |