import autoBind from 'auto-bind';
import classNames from 'classnames';
import { isString } from 'lodash';
import React, { useEffect } from 'react';
import { toast } from 'react-toastify';
import styled from 'styled-components';
import { SessionButton, SessionButtonColor, SessionButtonType } from './basic/SessionButton';
// import { SessionSpinner } from './basic/SessionSpinner';
import { SessionTheme } from '../themes/SessionTheme';
import { switchPrimaryColorTo } from '../themes/switchPrimaryColor';
import { switchThemeTo } from '../themes/switchTheme';
import { SessionToastContainer } from './SessionToastContainer';
import { SessionWrapperModal } from './SessionWrapperModal';
import { SessionSpinner } from './basic/SessionSpinner';
import { SessionToast } from './basic/SessionToast';
interface State {
errorCount: number;
clearDataView: boolean;
loading: boolean;
}
export const MAX_LOGIN_TRIES = 3;
const TextPleaseWait = (props: { isLoading: boolean }) => {
if (!props.isLoading) {
return null;
}
return
{window.i18n('pleaseWaitOpenAndOptimizeDb')}
;
};
const StyledContent = styled.div`
background-color: var(--background-secondary-color);
height: 100%;
width: 100%;
`;
// We cannot import toastutils from the password window as it is pulling the whole sending
// pipeline(and causing crashes on Session instances with password)
function pushToastError(id: string, title: string, description?: string) {
toast.error(, {
toastId: id,
updateId: id,
});
}
class SessionPasswordPromptInner extends React.PureComponent {
private inputRef?: any;
constructor(props: any) {
super(props);
this.state = {
errorCount: 0,
clearDataView: false,
loading: false,
};
autoBind(this);
}
public componentDidMount() {
setTimeout(() => {
this.inputRef?.focus();
}, 100);
}
public render() {
const isLoading = this.state.loading;
const spinner = isLoading ? : null;
const featureElement = this.state.clearDataView ? (
{window.i18n('deleteAccountFromLogin')}
) : (
{
this.inputRef = input;
}}
/>
);
return (
{spinner || featureElement}
{this.state.clearDataView
? this.renderClearDataViewButtons()
: this.renderPasswordViewButtons()}
);
}
public onKeyUp(event: any) {
switch (event.key) {
case 'Enter':
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,
});
if (error && isString(error)) {
pushToastError('onLogin', error);
} else if (error?.message && isString(error.message)) {
pushToastError('onLogin', error.message);
}
global.setTimeout(() => {
document.getElementById('password-prompt-input')?.focus();
}, 50);
}
this.setState({
loading: false,
});
}
private initLogin() {
this.setState({
loading: true,
});
const passPhrase = String((this.inputRef as HTMLInputElement).value);
// this is to make sure a render has the time to happen before we lock the thread with all of the db work
// this might be removed once we get the db operations to a worker thread
global.setTimeout(() => {
void this.onLogin(passPhrase);
}, 100);
}
private initClearDataView() {
this.setState({
errorCount: 0,
clearDataView: true,
});
}
private renderPasswordViewButtons(): JSX.Element {
const showResetElements = this.state.errorCount >= MAX_LOGIN_TRIES;
return (