tweb/public/709.c5451446b3485d2557e8.ch...

1 line
17 KiB
Plaintext

{"version":3,"file":"709.c5451446b3485d2557e8.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\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","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","/*\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 type {DcId} from '../types';\nimport Page from './page';\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport {putPreloader} from '../components/putPreloader';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport pause from '../helpers/schedulers/pause';\nimport fixBase64String from '../helpers/fixBase64String';\nimport bytesCmp from '../helpers/bytes/bytesCmp';\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\nimport textToSvgURL from '../helpers/textToSvgURL';\n\nconst FETCH_INTERVAL = 3;\n\nconst onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n let preloader = putPreloader(imageDiv, true);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n getLanguageChangeButton(inputWrapper);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n import('./pageSignIn').then((m) => m.default.mount());\n stop = true;\n });\n\n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n rootScope.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id as DcId;\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\n // continue;\n }\n\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n rootScope.managers.apiManager.setUser(authorization.user);\n import('./pageIm').then((m) => m.default.mount());\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n const encoded = bytesToBase64(loginToken.token);\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\n\n const style = window.getComputedStyle(document.documentElement);\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\n const textColor = style.getPropertyValue('--primary-text-color').trim();\n const primaryColor = style.getPropertyValue('--primary-color').trim();\n\n const logoUrl = await fetch('assets/img/logo_padded.svg')\n .then((res) => res.text())\n .then((text) => {\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\n return textToSvgURL(text);\n });\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: logoUrl,\n dotsOptions: {\n color: textColor,\n type: 'rounded'\n },\n cornersSquareOptions: {\n type: 'extra-rounded'\n },\n imageOptions: {\n imageSize: 1,\n margin: 0\n },\n backgroundOptions: {\n color: surfaceColor\n },\n qrOptions: {\n errorCorrectionLevel: 'L'\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise<void>;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise<void>((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n if(preloader) {\n preloader.style.animation = 'hide-icon .4s forwards';\n\n const c = imageDiv.children[1] as HTMLElement;\n c.style.display = 'none';\n c.style.animation = 'grow-icon .4s forwards';\n setTimeout(() => {\n c.style.display = '';\n }, 150);\n\n setTimeout(() => {\n c.style.animation = '';\n }, 500);\n preloader = undefined;\n } else {\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\n el.remove();\n });\n }\n });\n }\n\n if(isLoop) {\n const timestamp = Date.now() / 1000;\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\n\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED':\n (err as ApiError).handled = true;\n import('./pagePassword').then((m) => m.default.mount());\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n stop = true;\n break;\n }\n\n return true;\n }\n\n return false;\n };\n\n // await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n\n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise<void>>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n // console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then((func) => {\n func();\n });\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\n});\n\nexport default page;\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":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","uint6ToBase64","nUint6","imageDiv","pageEl","querySelector","preloader","putPreloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","addEventListener","m","default","mount","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","length","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","textToSvgURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","type","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","resolve","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","err","handled","console","error","func"],"sourceRoot":""}