nifty-wallet/old-ui/app/keychains/hd/restore-vault.js

194 lines
5.2 KiB
JavaScript
Raw Normal View History

2017-11-14 08:04:23 -08:00
const inherits = require('util').inherits
const PersistentForm = require('../../../lib/persistent-form')
const connect = require('react-redux').connect
const h = require('react-hyperscript')
2017-11-15 09:35:18 -08:00
const actions = require('../../../../ui/app/actions')
2017-11-14 08:04:23 -08:00
module.exports = connect(mapStateToProps)(RestoreVaultScreen)
inherits(RestoreVaultScreen, PersistentForm)
function RestoreVaultScreen () {
PersistentForm.call(this)
}
function mapStateToProps (state) {
return {
warning: state.appState.warning,
forgottenPassword: state.appState.forgottenPassword,
}
}
RestoreVaultScreen.prototype.render = function () {
var state = this.props
this.persistentFormParentId = 'restore-vault-form'
return (
2018-08-07 06:23:56 -07:00
h('div', {
2018-08-06 11:11:06 -07:00
style: {
2018-08-07 06:23:56 -07:00
width: '100%',
2018-08-06 11:11:06 -07:00
},
}, [
2018-08-07 06:23:56 -07:00
h('.section-title', { style: {
height: '1px',
width: '100%',
}}),
h('.initialize-screen.flex-column.flex-center.flex-grow', {
2017-11-14 08:04:23 -08:00
style: {
2018-08-07 06:23:56 -07:00
paddingLeft: '30px',
paddingRight: '30px',
2017-11-14 08:04:23 -08:00
},
}, [
2018-08-07 06:23:56 -07:00
h('h3.flex-center', {
2018-08-06 11:11:06 -07:00
style: {
2018-08-07 06:23:56 -07:00
fontFamily: 'Nunito SemiBold',
background: '#ffffff',
color: '#333333',
2018-08-06 11:11:06 -07:00
width: '100%',
2018-08-07 06:23:56 -07:00
fontSize: '16px',
padding: 30,
2018-08-06 11:11:06 -07:00
},
}, [
2018-08-07 06:23:56 -07:00
h('.page-subtitle', 'Restore Vault'),
]),
2017-11-14 08:04:23 -08:00
2018-08-07 06:23:56 -07:00
// wallet seed entry
h('h3.flex-left', {
style: {
width: '100%',
marginBottom: '20px',
fontFamily: 'Nunito SemiBold',
2018-08-07 06:23:56 -07:00
},
}, 'Wallet Seed'),
h('textarea.twelve-word-phrase', {
placeholder: 'Enter your secret twelve word phrase here to restore your vault.',
}),
// password
h('input.large-input', {
type: 'password',
id: 'password-box',
placeholder: 'New Password (min 8 chars)',
dataset: {
persistentFormId: 'password',
},
style: {
width: '100%',
marginTop: 20,
border: '1px solid #e2e2e2',
},
}),
// confirm password
h('input.large-input', {
type: 'password',
id: 'password-box-confirm',
placeholder: 'Confirm Password',
onKeyPress: this.createOnEnter.bind(this),
dataset: {
persistentFormId: 'password-confirmation',
},
style: {
width: '100%',
marginTop: 20,
border: '1px solid #e2e2e2',
},
}),
(state.warning) && (
h('div', {
style: {
padding: '20px 0 0',
width: '100%',
},
}, [
h('div.error.in-progress-notification', state.warning),
])
),
2017-11-14 08:04:23 -08:00
2018-08-07 06:23:56 -07:00
// submit
2017-11-14 08:04:23 -08:00
2018-08-07 06:23:56 -07:00
h('.flex-row.flex-space-between.flex-right', {
2018-07-26 15:54:07 -07:00
style: {
2018-08-07 06:23:56 -07:00
marginTop: 20,
width: '100%',
2018-07-27 09:54:23 -07:00
},
2018-08-07 06:23:56 -07:00
}, [
2017-11-14 08:04:23 -08:00
2018-08-07 06:23:56 -07:00
// cancel
h('button.btn-violet', {
onClick: this.showInitializeMenu.bind(this),
style: {
marginRight: '10px',
},
}, 'Cancel'),
2017-11-14 08:04:23 -08:00
2018-08-07 06:23:56 -07:00
// submit
h('button', {
onClick: this.createNewVaultAndRestore.bind(this),
}, 'Ok'),
]),
2017-11-14 08:04:23 -08:00
]),
])
)
}
RestoreVaultScreen.prototype.showInitializeMenu = function () {
if (this.props.forgottenPassword) {
this.props.dispatch(actions.backToUnlockView())
} else {
this.props.dispatch(actions.showInitializeMenu())
}
}
RestoreVaultScreen.prototype.createOnEnter = function (event) {
if (event.key === 'Enter') {
this.createNewVaultAndRestore()
}
}
RestoreVaultScreen.prototype.createNewVaultAndRestore = function () {
// check password
var passwordBox = document.getElementById('password-box')
var password = passwordBox.value
var passwordConfirmBox = document.getElementById('password-box-confirm')
var passwordConfirm = passwordConfirmBox.value
if (password.length < 8) {
this.warning = 'Password not long enough'
this.props.dispatch(actions.displayWarning(this.warning))
return
}
if (password !== passwordConfirm) {
this.warning = 'Passwords don\'t match'
this.props.dispatch(actions.displayWarning(this.warning))
return
}
// check seed
var seedBox = document.querySelector('textarea.twelve-word-phrase')
var seed = seedBox.value.trim()
// true if the string has more than a space between words.
if (seed.split(' ').length > 1) {
2018-03-13 15:24:35 -07:00
this.warning = 'there can only be a space between words'
this.props.dispatch(actions.displayWarning(this.warning))
return
}
// true if seed contains a character that is not between a-z or a space
2018-03-13 14:41:54 -07:00
if (!seed.match(/^[a-z ]+$/)) {
this.warning = 'seed words only have lowercase characters'
this.props.dispatch(actions.displayWarning(this.warning))
return
}
2017-11-14 08:04:23 -08:00
if (seed.split(' ').length !== 12) {
this.warning = 'seed phrases are 12 words long'
this.props.dispatch(actions.displayWarning(this.warning))
return
}
// submit
this.warning = null
this.props.dispatch(actions.displayWarning(this.warning))
this.props.dispatch(actions.createNewVaultAndRestore(password, seed))
}