Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
5.3 KiB
168 lines
5.3 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import AppTwoStepVerificationTab from "."; |
|
import { SettingSection } from "../.."; |
|
import { attachClickEvent, cancelEvent, canFocus, replaceContent } from "../../../../helpers/dom"; |
|
import { AccountPassword } from "../../../../layer"; |
|
import I18n, { i18n } from "../../../../lib/langPack"; |
|
import passwordManager from "../../../../lib/mtproto/passwordManager"; |
|
import RichTextProcessor from "../../../../lib/richtextprocessor"; |
|
import Button from "../../../button"; |
|
import { putPreloader } from "../../../misc"; |
|
import PasswordMonkey from "../../../monkeys/password"; |
|
import PasswordInputField from "../../../passwordInputField"; |
|
import { SliderSuperTab } from "../../../slider"; |
|
import AppTwoStepVerificationReEnterPasswordTab from "./reEnterPassword"; |
|
|
|
export default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab { |
|
public state: AccountPassword; |
|
public passwordInputField: PasswordInputField; |
|
public plainPassword: string; |
|
public isFirst = true; |
|
|
|
protected init() { |
|
const isNew = !this.state.pFlags.has_password || this.plainPassword; |
|
this.container.classList.add('two-step-verification', 'two-step-verification-enter-password'); |
|
this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword'); |
|
|
|
const section = new SettingSection({ |
|
noDelimiter: true |
|
}); |
|
|
|
const inputWrapper = document.createElement('div'); |
|
inputWrapper.classList.add('input-wrapper'); |
|
|
|
const passwordInputField = this.passwordInputField = new PasswordInputField({ |
|
name: 'enter-password', |
|
label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'), |
|
labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined |
|
}); |
|
|
|
const monkey = new PasswordMonkey(passwordInputField, 157); |
|
|
|
const btnContinue = Button('btn-primary btn-color-primary'); |
|
const textEl = new I18n.IntlElement({key: 'Continue'}); |
|
|
|
btnContinue.append(textEl.element); |
|
|
|
inputWrapper.append(passwordInputField.container, btnContinue); |
|
section.content.append(monkey.container, inputWrapper); |
|
|
|
this.scrollable.container.append(section.container); |
|
|
|
passwordInputField.input.addEventListener('keypress', (e) => { |
|
if(passwordInputField.input.classList.contains('error')) { |
|
passwordInputField.input.classList.remove('error'); |
|
textEl.key = 'Continue'; |
|
textEl.update(); |
|
} |
|
|
|
if(e.key === 'Enter') { |
|
return onContinueClick(); |
|
} |
|
}); |
|
|
|
const verifyInput = () => { |
|
if(!passwordInputField.value.length) { |
|
passwordInputField.input.classList.add('error'); |
|
return false; |
|
} |
|
|
|
return true; |
|
}; |
|
|
|
let onContinueClick: (e?: Event) => void; |
|
if(!isNew) { |
|
let getStateInterval: number; |
|
|
|
let getState = () => { |
|
// * just to check session relevance |
|
if(!getStateInterval) { |
|
getStateInterval = window.setInterval(getState, 10e3); |
|
} |
|
|
|
return passwordManager.getState().then(_state => { |
|
this.state = _state; |
|
|
|
if(this.state.hint) { |
|
passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint); |
|
} else { |
|
replaceContent(passwordInputField.label, i18n('LoginPassword')); |
|
} |
|
}); |
|
}; |
|
|
|
const submit = (e?: Event) => { |
|
if(!verifyInput()) { |
|
cancelEvent(e); |
|
return; |
|
} |
|
|
|
btnContinue.setAttribute('disabled', 'true'); |
|
textEl.key = 'PleaseWait'; |
|
textEl.update(); |
|
const preloader = putPreloader(btnContinue); |
|
|
|
const plainPassword = passwordInputField.value; |
|
passwordManager.check(passwordInputField.value, this.state).then(auth => { |
|
console.log(auth); |
|
|
|
if(auth._ === 'auth.authorization') { |
|
clearInterval(getStateInterval); |
|
if(monkey) monkey.remove(); |
|
const tab = new AppTwoStepVerificationTab(this.slider); |
|
tab.state = this.state; |
|
tab.plainPassword = plainPassword; |
|
tab.open(); |
|
this.slider.removeTabFromHistory(this); |
|
} |
|
}, (err) => { |
|
btnContinue.removeAttribute('disabled'); |
|
passwordInputField.input.classList.add('error'); |
|
|
|
switch(err.type) { |
|
default: |
|
//btnContinue.innerText = err.type; |
|
textEl.key = 'TwoStepAuth.InvalidPassword'; |
|
textEl.update(); |
|
preloader.remove(); |
|
break; |
|
} |
|
|
|
getState(); |
|
}); |
|
}; |
|
|
|
onContinueClick = submit; |
|
|
|
getState(); |
|
} else { |
|
onContinueClick = (e) => { |
|
if(e) { |
|
cancelEvent(e); |
|
} |
|
|
|
if(!verifyInput()) return; |
|
|
|
const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider); |
|
tab.state = this.state; |
|
tab.newPassword = passwordInputField.value; |
|
tab.plainPassword = this.plainPassword; |
|
tab.open(); |
|
}; |
|
} |
|
|
|
attachClickEvent(btnContinue, onContinueClick); |
|
|
|
return monkey.load(); |
|
} |
|
|
|
onOpenAfterTimeout() { |
|
if(!canFocus(this.isFirst)) return; |
|
this.passwordInputField.input.focus(); |
|
} |
|
}
|
|
|