1 line
60 KiB
Plaintext
1 line
60 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/helpers/dom/documentFragmentToHTML.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/array/randomize.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/pages/loginPage.ts"],"names":["documentFragmentToHTML","fragment","Array","from","childNodes","map","node","nodeType","textContent","outerHTML","join","findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","entities","offset","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","prepend","insertBefore","cloneNode","container","append","addEventListener","htmlToSpan","html","span","innerHTML","isInputEmpty","element","hasAttribute","value","trim","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","update","preloader","setValueSilently","Math","random","check","response","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","lastChild","replaceWith","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","replace","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","transitionDuration","log","abs","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","arr","crypto","getRandomValues","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","field","withEntities","combineSameEntities","sortEntities","LoginPage","body","querySelector","title","subtitle"],"mappings":"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","file":"12.e359dd53060d4015fdd7.chunk.js","sourcesContent":["import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\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\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract<MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityCode' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler'>;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\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.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\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\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\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: ReturnType<LottieLoader['waitForFirstFrame']>;\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.loadAnimationAsAsset({\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 }, 'TwoFactorSetupMonkeyPeek').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 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 cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\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 passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\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 import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\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});\r\n\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\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(/<style([\\s\\S]*)<\\/style>/, '');\r\n html = html.replace(/<!--([\\s\\S]*)-->/, '');\r\n\r\n const match = html.match(/<body>([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like <p>asd</p>\\n<p>zxc</p>\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n const fragment = RichTextProcessor.wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const 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 | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\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 required: boolean;\r\n public validate: () => boolean;\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 this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = 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=\"${String(!!canBeEdited)}\" 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 input.setAttribute('dir', 'auto');\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, false).value].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.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, 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(setHeight = true) {\r\n const {scrollHeight: newHeight/* , 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 const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\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 simulateEvent(this.input, 'input');\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 isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(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 setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\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","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 * 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, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\nimport randomize from '../../helpers/array/randomize';\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: Promise<InputCheckPasswordSRP>;\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.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\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 randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('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.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\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","export default function randomize<T extends ArrayBufferView>(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\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 * 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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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"],"sourceRoot":""} |