import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton } from './SessionButton'; interface Props { onClose: any; } interface State { error: string; loadingPassword: boolean; loadingSeed: boolean; seed: string; hasPassword: boolean | null; passwordHash: string; passwordValid: boolean; } export class SessionSeedModal extends React.Component { constructor(props: any) { super(props); this.state = { error: '', loadingPassword: true, loadingSeed: true, seed: '', hasPassword: null, passwordHash: '', passwordValid: false, }; this.copySeed = this.copySeed.bind(this); this.getSeed = this.getSeed.bind(this); this.confirmPassword = this.confirmPassword.bind(this); this.checkHasPassword = this.checkHasPassword.bind(this); } public render() { const i18n = window.i18n; const { onClose } = this.props; const maxPasswordLen = 64; this.checkHasPassword(); this.getSeed(); const error = this.state.error; const hasPassword = this.state.hasPassword; const passwordValid = this.state.passwordValid; const loading = this.state.loadingPassword || this.state.loadingSeed; return ( null} onClose={onClose} > {!loading && ( <>
{hasPassword && !passwordValid ? (

{i18n('showSeedPasswordRequest')}

{error && ( <>
{error}
)}
) : ( <>

{i18n('seedSavePrompt')}

{this.state.seed}
{ this.copySeed(this.state.seed); }} />
)} )} ); } private confirmPassword() { const passwordHash = this.state.passwordHash; const passwordValue = $('#seed-input-password').val(); const isPasswordValid = window.passwordUtil.matchesHash( passwordValue, passwordHash ); if (!passwordValue) { this.setState({ error: window.i18n('noGivenPassword'), }); return false; } if (passwordHash && !isPasswordValid) { this.setState({ error: window.i18n('invalidPassword'), }); return false; } this.setState({ passwordValid: true, error: '', }); return true; } private checkHasPassword() { if (!this.state.loadingPassword) { return; } const hashPromise = window.Signal.Data.getPasswordHash(); hashPromise.then((hash: any) => { this.setState({ hasPassword: !!hash, passwordHash: hash, loadingPassword: false, }); }); } private async getSeed() { if (this.state.seed) { return this.state.seed; } const manager = await window.getAccountManager(); const seed = manager.getCurrentMnemonic(); this.setState({ seed, loadingSeed: false, }); return seed; } private copySeed(seed: string) { window.clipboard.writeText(seed); window.pushToast({ title: window.i18n('copiedMnemonic'), type: 'success', id: 'copySeedToast', }); } }