Browse Source

login/create seed qr

v0.25
pbca26 7 years ago
parent
commit
af198ead12
  1. 10
      react/src/components/dashboard/qrModal/qrModal.js
  2. 8
      react/src/components/dashboard/qrModal/qrModal.render.js
  3. 4
      react/src/components/dashboard/sendCoin/sendCoin.render.js
  4. 17
      react/src/components/login/login.js
  5. 23
      react/src/components/login/login.render.js
  6. 19
      react/src/components/login/login.scss
  7. 2
      react/src/translate/en.js

10
react/src/components/dashboard/qrModal/qrModal.js

@ -2,7 +2,7 @@ import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import Store from '../../../store'; import Store from '../../../store';
import { translate } from '../../../translate/translate'; import { translate } from '../../../translate/translate';
import QrReader from 'react-qr-reader' import QrReader from 'react-qr-reader';
import { import {
QRModalRender, QRModalRender,
QRModalReaderRender, QRModalReaderRender,
@ -72,15 +72,11 @@ class QRModal extends React.Component {
const a = document.getElementById('saveModalImage' + this.props.content); const a = document.getElementById('saveModalImage' + this.props.content);
a.href = dataURL; a.href = dataURL;
a.download = this.props.content; a.download = this.props.fileName || this.props.content;
} }
render() { render() {
if (this.props.mode === 'scan') { return this.props.mode === 'scan' ? QRModalReaderRender.call(this) : QRModalRender.call(this);
return QRModalReaderRender.call(this);
} else {
return QRModalRender.call(this);
}
} }
} }

8
react/src/components/dashboard/qrModal/qrModal.render.js

@ -14,7 +14,7 @@ export const QRModalRender = function() {
<div <div
className={ 'modal modal-3d-sign ' + (this.state.modalIsOpen ? 'show in' : 'fade hide') } className={ 'modal modal-3d-sign ' + (this.state.modalIsOpen ? 'show in' : 'fade hide') }
id="QRModal"> id="QRModal">
<div className="modal-dialog modal-center modal-sm"> <div className={ `modal-dialog modal-center modal-${this.props.modalSize || 'sm' }` }>
<div className="modal-content"> <div className="modal-content">
<div className="modal-header bg-orange-a400 wallet-send-header"> <div className="modal-header bg-orange-a400 wallet-send-header">
<button <button
@ -23,7 +23,7 @@ export const QRModalRender = function() {
onClick={ this.closeModal }> onClick={ this.closeModal }>
<span>×</span> <span>×</span>
</button> </button>
<h4 className="modal-title white text-left">{ translate('INDEX.SCAN_QR_CODE') }</h4> <h4 className="modal-title white text-left">{ this.props.title || translate('INDEX.SCAN_QR_CODE') }</h4>
</div> </div>
<div className="modal-body"> <div className="modal-body">
<div className="animsition vertical-align fade-in"> <div className="animsition vertical-align fade-in">
@ -32,7 +32,7 @@ export const QRModalRender = function() {
className="page-content vertical-align-middle text-center"> className="page-content vertical-align-middle text-center">
<QRCode <QRCode
value={ this.props.content } value={ this.props.content }
size={ 198 } /> size={ Number(this.props.qrSize) || 198 } />
<p className="margin-top-10"> <p className="margin-top-10">
<a href="" <a href=""
id={ 'saveModalImage' + this.props.content } id={ 'saveModalImage' + this.props.content }
@ -61,7 +61,7 @@ export const QRModalReaderRender = function() {
className="btn btn-default" className="btn btn-default"
onClick={ this.openModal }> onClick={ this.openModal }>
<i className="icon fa-qrcode"></i> <i className="icon fa-qrcode"></i>
{ translate('INDEX.SCAN_QRCODE_WEBCAM') } { translate('INDEX.SCAN_QR_CODE') }
</button> </button>
<div <div
className={ 'modal modal-3d-sign ' + (this.state.modalIsOpen ? 'show in' : 'fade hide') } className={ 'modal modal-3d-sign ' + (this.state.modalIsOpen ? 'show in' : 'fade hide') }

4
react/src/components/dashboard/sendCoin/sendCoin.render.js

@ -56,7 +56,7 @@ export const _SendFormRender = function() {
<button type="button" <button type="button"
className="btn btn-default btn-send-self" className="btn btn-default btn-send-self"
onClick={ this.setSendToSelf }> onClick={ this.setSendToSelf }>
Self { translate('SEND.SELF') }
</button> </button>
} }
<label <label
@ -78,7 +78,7 @@ export const _SendFormRender = function() {
<button type="button" <button type="button"
className="btn btn-default btn-send-self" className="btn btn-default btn-send-self"
onClick={ this.setSendAmountAll }> onClick={ this.setSendAmountAll }>
All { translate('SEND.ALL') }
</button> </button>
} }
<label <label

17
react/src/components/login/login.js

@ -79,6 +79,7 @@ class Login extends React.Component {
this.updateDecryptKey = this.updateDecryptKey.bind(this); this.updateDecryptKey = this.updateDecryptKey.bind(this);
this.loadPinList = this.loadPinList.bind(this); this.loadPinList = this.loadPinList.bind(this);
this.updateSelectedShortcut = this.updateSelectedShortcut.bind(this); this.updateSelectedShortcut = this.updateSelectedShortcut.bind(this);
this.setRecieverFromScan = this.setRecieverFromScan.bind(this);
} }
// the setInterval handler for 'activeCoins' // the setInterval handler for 'activeCoins'
@ -93,6 +94,22 @@ class Login extends React.Component {
}); });
} }
setRecieverFromScan(receiver) {
if (receiver) {
this.setState({
loginPassphrase: receiver,
});
} else {
Store.dispatch(
triggerToaster(
'Unable to recognize QR code',
'QR scan Error',
'error'
)
);
}
}
isCustomWalletSeed() { isCustomWalletSeed() {
return this.state.customWalletSeed; return this.state.customWalletSeed;
} }

23
react/src/components/login/login.render.js

@ -2,6 +2,7 @@ import React from 'react';
import { translate } from '../../translate/translate'; import { translate } from '../../translate/translate';
import LoginSettingsModal from '../dashboard/loginSettingsModal/loginSettingsModal'; import LoginSettingsModal from '../dashboard/loginSettingsModal/loginSettingsModal';
import ZcparamsFetchModal from '../dashboard/zcparamsFetchModal/zcparamsFetchModal'; import ZcparamsFetchModal from '../dashboard/zcparamsFetchModal/zcparamsFetchModal';
import QRModal from '../dashboard/qrModal/qrModal';
import Select from 'react-select'; import Select from 'react-select';
import ReactTooltip from 'react-tooltip'; import ReactTooltip from 'react-tooltip';
@ -59,9 +60,9 @@ const LoginRender = function() {
<div className="form-group form-material floating col-sm-12 horizontal-padding-0"> <div className="form-group form-material floating col-sm-12 horizontal-padding-0">
<input <input
type="password" type="password"
className={ !this.state.seedInputVisibility ? 'form-control' : 'hide' }
name="loginPassphrase" name="loginPassphrase"
ref="loginPassphrase" ref="loginPassphrase"
className={ !this.state.seedInputVisibility ? 'form-control' : 'hide' }
onChange={ this.updateLoginPassPhraseInput } onChange={ this.updateLoginPassPhraseInput }
onKeyDown={ (event) => this.handleKeydown(event) } onKeyDown={ (event) => this.handleKeydown(event) }
autoComplete="off" autoComplete="off"
@ -81,6 +82,11 @@ const LoginRender = function() {
<label <label
className="floating-label" className="floating-label"
htmlFor="inputPassword">{ translate('INDEX.WALLET_SEED') }</label> htmlFor="inputPassword">{ translate('INDEX.WALLET_SEED') }</label>
<div className="qr-modal-login-block">
<QRModal
mode="scan"
setRecieverFromScan={ this.setRecieverFromScan } />
</div>
</div> </div>
{ this.state.loginPassPhraseSeedType && { this.state.loginPassPhraseSeedType &&
<div <div
@ -89,7 +95,6 @@ const LoginRender = function() {
<div className="placeholder-label">{ this.state.loginPassPhraseSeedType }</div> <div className="placeholder-label">{ this.state.loginPassPhraseSeedType }</div>
</div> </div>
} }
{ this.state.loginPassphrase && { this.state.loginPassphrase &&
this.state.enableEncryptSeed && this.state.enableEncryptSeed &&
<div className="row"> <div className="row">
@ -369,7 +374,9 @@ const LoginRender = function() {
<button <button
className="copy-floating-label" className="copy-floating-label"
htmlFor="walletseed" htmlFor="walletseed"
onClick={ () => this.copyPassPhraseToClipboard() }>{ translate('INDEX.COPY') }</button> onClick={ () => this.copyPassPhraseToClipboard() }>
{ translate('INDEX.COPY') }
</button>
<span className={ this.state.isCustomSeedWeak ? 'tooltiptext' : 'hide' }> <span className={ this.state.isCustomSeedWeak ? 'tooltiptext' : 'hide' }>
<strong>{ translate('INDEX.WEAK_SEED') }</strong><br /><br /> <strong>{ translate('INDEX.WEAK_SEED') }</strong><br /><br />
{ translate('INDEX.YOUR_SEED_MUST_CONTAIN') }<br /> { translate('INDEX.YOUR_SEED_MUST_CONTAIN') }<br />
@ -400,6 +407,16 @@ const LoginRender = function() {
<label <label
className="floating-label" className="floating-label"
htmlFor="rwalletseed">{ translate('INDEX.CONFIRM_SEED') }</label> htmlFor="rwalletseed">{ translate('INDEX.CONFIRM_SEED') }</label>
<button
type="button"
className="btn btn-success btn-block margin-top-20 btn-generate-qr">
<QRModal
qrSize="256"
modalSize="md"
title="Seed QR recovery"
fileName="agama-seed"
content={ this.state.randomSeed } />
</button>
</div> </div>
<button <button
type="button" type="button"

19
react/src/components/login/login.scss

@ -232,4 +232,23 @@ option.login-option {
left: 15px; left: 15px;
color: #fff; color: #fff;
} }
}
.qrcode-modal + .modal {
a {
color: #fff;
}
}
.btn-generate-qr {
.qrcode-modal {
display: block;
}
}
.qr-modal-login-block {
.btn {
background: transparent;
color: #fff;
}
} }

2
react/src/translate/en.js

@ -744,6 +744,8 @@ export const LANG_EN = {
'DOWNLOAD': 'Download', 'DOWNLOAD': 'Download',
}, },
'SEND': { 'SEND': {
'SELF': 'Self',
'ALL': 'All',
'BAD_TXN_SPENT_ERR1': 'This particular error can happen in the following cases:', 'BAD_TXN_SPENT_ERR1': 'This particular error can happen in the following cases:',
'BAD_TXN_SPENT_ERR2': 'Your machine\'s clock is not set properly', 'BAD_TXN_SPENT_ERR2': 'Your machine\'s clock is not set properly',
'BAD_TXN_SPENT_ERR3': 'SPV server is temporary out of sync. Try to switch over to another one.', 'BAD_TXN_SPENT_ERR3': 'SPV server is temporary out of sync. Try to switch over to another one.',

Loading…
Cancel
Save