import React from 'react'; import classNames from 'classnames'; import { SessionIcon, SessionIconType } from './icon'; import { SessionButton, SessionButtonColor, SessionButtonType } from './SessionButton'; import { Constants } from '../../session'; import { DefaultTheme, withTheme } from 'styled-components'; interface State { error: string; errorCount: number; clearDataView: boolean; } export const MAX_LOGIN_TRIES = 3; class SessionPasswordPromptInner extends React.PureComponent<{ theme: DefaultTheme }, State> { private readonly inputRef: React.RefObject; constructor(props: any) { super(props); this.state = { error: '', errorCount: 0, clearDataView: false, }; this.onKeyUp = this.onKeyUp.bind(this); this.initLogin = this.initLogin.bind(this); this.initClearDataView = this.initClearDataView.bind(this); this.inputRef = React.createRef(); } public componentDidMount() { (this.inputRef.current as HTMLInputElement).focus(); } public render() { const showResetElements = this.state.errorCount >= MAX_LOGIN_TRIES; const wrapperClass = this.state.clearDataView ? 'clear-data-wrapper' : 'password-prompt-wrapper'; const containerClass = this.state.clearDataView ? 'clear-data-container' : 'password-prompt-container'; const infoAreaClass = this.state.clearDataView ? 'warning-info-area' : 'password-info-area'; const infoTitle = this.state.clearDataView ? window.i18n('clearAllData') : window.i18n('passwordViewTitle'); const buttonGroup = this.state.clearDataView ? this.renderClearDataViewButtons() : this.renderPasswordViewButtons(); const featureElement = this.state.clearDataView ? (

{window.i18n('deleteAccountWarning')}

) : ( ); const infoIcon = this.state.clearDataView ? ( ) : ( ); const errorSection = !this.state.clearDataView && (
{this.state.error && ( <> {showResetElements ? (
{window.i18n('maxPasswordAttempts')}
) : (
{this.state.error}
)} )}
); return (
{infoIcon}

{infoTitle}

{featureElement} {errorSection} {buttonGroup}
); } public async onKeyUp(event: any) { switch (event.key) { case 'Enter': await this.initLogin(); break; default: } event.preventDefault(); } public async onLogin(passPhrase: string) { const passPhraseTrimmed = passPhrase.trim(); try { await window.onLogin(passPhraseTrimmed); } catch (error) { // Increment the error counter and show the button if necessary this.setState({ errorCount: this.state.errorCount + 1, }); this.setState({ error }); } } private async initLogin() { const passPhrase = String((this.inputRef.current as HTMLInputElement).value); await this.onLogin(passPhrase); } private initClearDataView() { this.setState({ error: '', errorCount: 0, clearDataView: true, }); } private renderPasswordViewButtons(): JSX.Element { const showResetElements = this.state.errorCount >= MAX_LOGIN_TRIES; return (
{showResetElements && ( <> )}
); } private renderClearDataViewButtons(): JSX.Element { return (
{ this.setState({ clearDataView: false }); }} />
); } } export const SessionPasswordPrompt = withTheme(SessionPasswordPromptInner);