proxy-based Twister client written with react-js
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
6.2 KiB

9 years ago
var ReactBootstrap = require('react-bootstrap')
, Button = ReactBootstrap.Button
, ButtonGroup = ReactBootstrap.ButtonGroup
, Glyphicon = ReactBootstrap.Glyphicon
, Modal = ReactBootstrap.Modal
, Input = ReactBootstrap.Input
var React = require('react');
var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
var SetIntervalMixin = require("../common/SetIntervalMixin.js");
module.exports = ExportAccountModalButton = React.createClass({
mixins: [
SafeStateChangeMixin
],
getInitialState: function () {
return {
isModalOpen: false,
useEncryption: true,
passphrase1: "",
passphrase2: "",
encryptionInProgess: false,
encryptionComplete: false,
encryptedKey: "",
publishedOnTiwster: false,
9 years ago
};
},
handleUseEncryptionChange: function(e) {
this.setState({
useEncryption: e.target.checked,
encryptionInProgess: false,
encryptionComplete: false,
encryptedKey: "",
publishedOnTwister: false,
9 years ago
});
},
handlePassphrase1Change: function(e) {
this.setState({
passphrase1: e.target.value,
encryptionInProgess: false,
encryptionComplete: false,
encryptedKey: "",
publishedOnTwister: false,
9 years ago
});
},
handlePassphrase2Change: function(e) {
this.setState({
passphrase2: e.target.value,
encryptionInProgess: false,
encryptionComplete: false,
encryptedKey: "",
publishedOnTwister: false,
9 years ago
});
},
handleToggle: function () {
this.setState({
isModalOpen: !this.state.isModalOpen
});
},
handleEncryption: function (e) {
e.preventDefault();
var thisComponent = this;
if(this.state.useEncryption){
var passphrase = this.state.passphrase1;
thisComponent.setStateSafe({encryptionInProgess: true});
Twister.getAccount(this.props.username).encryptPrivateKey(passphrase,
function(encryptedKey){
thisComponent.setStateSafe({encryptedKey: encryptedKey, encryptionComplete: true, encryptionInProgess: false});
});
}else{
var wif = Twister.getAccount(this.props.username).getPrivateKey();
thisComponent.setStateSafe({encryptedKey: wif, encryptionComplete: true, encryptionInProgess: false});
}
return;
},
publishOnTwister: function() {
var thisComponent = this;
if(this.state.useEncryption && this.state.encryptedKey.length && this.state.encryptedKey.startsWith("6P")){
Twister.getAccount(this.props.username).updateProfileFields({bip38:this.state.encryptedKey},function(profile){
thisComponent.setStateSafe({publishedOnTwister: true});
})
}
},
9 years ago
render: function() {
var belowForm = (
<p/>
);
if(this.state.encryptionInProgess){
belowForm = (
<p>Encryption in progress. Sorry for the lag.</p>
)
}
if(this.state.encryptionComplete){
if(this.state.useEncryption){
var formattedBody = "Your encrypted key for Twister: "
+this.state.encryptedKey
+"\n\nAdvice: Print this email and note down your username and passphrase on the same piece of paper.";
var subject = "Encrypted Twister Private Key";
var mailToLink = "mailto:?body=" + encodeURIComponent(formattedBody) + "&subject=" + encodeURIComponent(subject);
var dataUrl = "data:text/plain;charset=utf-8;base64,"+btoa(this.state.encryptedKey);
var publishOnTwisterDisabled = this.props.accountStatus != "confirmed";
var publishedOnTwisterButtonStr = "Publish on Twister" + (this.state.publishedOnTwister?" ✓":"");
9 years ago
belowForm = (
<p>
{"Your encrypted key: "+this.state.encryptedKey}
<br/>
<Button download="twisterkey.txt" href={dataUrl}>Download</Button>
9 years ago
<Button href={mailToLink}>Send via Email</Button>
<Button onClick={this.publishOnTwister} disabled={publishOnTwisterDisabled}>{publishedOnTwisterButtonStr}</Button>
9 years ago
</p>
)
}else{
var dataUrl = "data:text/plain;charset=utf-8;base64,"+btoa(this.state.encryptedKey);
9 years ago
belowForm = (
<p>
{"Your private key: "+this.state.encryptedKey}
<Button download="twisterkey.txt" href={dataUrl}>Download</Button>
<Button disabled>Send via Email</Button>
<Button disabled>Publish on Twister</Button>
9 years ago
</p>
)
}
}
var submitButton = (
<Input type='submit' value='Encrypt Private Key' disabled={this.state.passphrase1!=this.state.passphrase2}/>
)
if(!this.state.useEncryption){
submitButton = (
<Input type='submit' value='Reveal Private Key'/>
);
}
return (
<Button onClick={this.handleToggle}>
Export Account
<Modal show={this.state.isModalOpen} bsStyle='primary' onHide={this.handleToggle}>
<Modal.Header>
<Glyphicon glyph='export'/>
</Modal.Header>
<Modal.Body>
<form onSubmit={this.handleEncryption}>
<Input
type='checkbox'
label='Use Encrpytion (highly recommended)'
checked={this.state.useEncryption}
onChange={this.handleUseEncryptionChange}
/>
<Input
type='password'
label='Passphrase'
value={this.state.passphrase1}
onChange={this.handlePassphrase1Change}
disabled={!this.state.useEncryption}
/>
<Input
type='password'
label='Repeat Passphrase'
value={this.state.passphrase2}
onChange={this.handlePassphrase2Change}
disabled={!this.state.useEncryption}
/>
{submitButton}
</form>
{belowForm}
</Modal.Body>
</Modal>
</Button>
);
}
});