1 line
35 KiB
Plaintext
1 line
35 KiB
Plaintext
{"version":3,"file":"709.3b68b61e4cee113d539e.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"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\nexport type ButtonOptions = 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\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType<typeof getLang>;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\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 {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-circular\" viewBox=\"25 25 50 50\">\r\n <circle class=\"preloader-path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-miterlimit=\"10\"/>\r\n </svg>`;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf<HTMLElement>) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\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 findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const 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 const 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 const 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(!IS_TOUCH_SUPPORTED) {\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 attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.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 const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.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 attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.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(attachListenerTo.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 const {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","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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 {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise<void>,\r\n write: CancellablePromise<void>\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise<void>();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26 ?\n nUint6 + 65 :\n nUint6 < 52 ?\n nUint6 + 71 :\n nUint6 < 62 ?\n nUint6 - 4 :\n nUint6 === 62 ?\n 43 :\n nUint6 === 63 ?\n 47 :\n 65;\n}\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 {DcId} from '../types';\r\nimport Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then((m) => m.default.mount());\r\n stop = true;\r\n });\r\n\r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n\r\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then((res) => res.text())\r\n .then((text) => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n // return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: 'L'\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise<void>;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise<void>((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise<void>>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","lastElementChild","remove","window","requestAnimationFrame","once","e","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","touches","length","cancelBubble","stopPropagation","passive","dataset","bytesCmp","bytes1","bytes2","len","i","sequentialDom","promises","raf","scheduled","do","kind","promise","this","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","uint6ToBase64","nUint6","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","diff","expires","err","console","warn","handled","error","func"],"sourceRoot":""} |