+ );
+ }
+
+ return (
+
+ {this.props.children}
+ {buttons}
+
+ );
+ }
+});
diff --git a/js/page/claim_code.js b/js/page/claim_code.js
index d904703a9..1655d37da 100644
--- a/js/page/claim_code.js
+++ b/js/page/claim_code.js
@@ -14,6 +14,10 @@ var ClaimCodePage = React.createClass({
getInitialState: function() {
return {
submitting: false,
+ modal: null,
+ referralCredits: null,
+ activationCredits: null,
+ failureReason: null,
}
},
handleSubmit: function(event) {
@@ -22,15 +26,19 @@ var ClaimCodePage = React.createClass({
}
if (!this.refs.code.value) {
- alert('Please enter an invitation code or choose "Skip."');
+ this.setState({
+ modal: 'missingCode',
+ });
return;
} else if (!this.refs.email.value) {
- alert('Please enter an email address or choose "Skip."');
+ this.setState({
+ modal: 'missingEmail',
+ });
return;
}
this.setState({
- submitting: true
+ submitting: true,
});
lbry.getNewAddress((address) => {
@@ -42,33 +50,25 @@ var ClaimCodePage = React.createClass({
var response = JSON.parse(xhr.responseText);
if (response.success) {
- var redeemMessage = 'Your invite code has been redeemed. ';
- if (response.referralCredits > 0) {
- redeemMessage += 'You have also earned ' + response.referralCredits + ' credits from referrals. A total of ' +
- (response.activationCredits + response.referralCredits) + ' will be added to your balance shortly.';
- } else if(response.activationCredits > 0) {
- redeemMessage += response.activationCredits + ' credits will be added to your balance shortly.';
- } else {
- redeemMessage += 'The credits will be added to your balance shortly.';
- }
- alert(redeemMessage);
- localStorage.setItem('claimCodeDone', true);
- window.location = '?home';
- } else {
- alert(response.reason);
this.setState({
- submitting: false
+ modal: 'codeRedeemed',
+ referralCredits: response.referralCredits,
+ activationCredits: response.activationCredits,
+ });
+ } else {
+ this.setState({
+ submitting: false,
+ modal: 'codeRedeemFailed',
+ failureReason: response.reason,
});
}
});
xhr.addEventListener('error', () => {
this.setState({
- submitting: false
+ submitting: false,
+ modal: 'couldNotConnect',
});
- alert('LBRY couldn\'t connect to our servers to confirm your invitation code. Please check your ' +
- 'internet connection. If you continue to have problems, you can still browse LBRY and ' +
- 'visit the Settings page to redeem your code later.');
});
xhr.open('POST', 'https://invites.lbry.io', true);
@@ -78,10 +78,19 @@ var ClaimCodePage = React.createClass({
});
},
handleSkip: function() {
- alert('Welcome to LBRY! You can visit the Wallet page to redeem an invite code at any time.');
+ this.setState({
+ modal: 'skipped',
+ });
+ },
+ handleFinished: function() {
localStorage.setItem('claimCodeDone', true);
window.location = '?home';
},
+ closeModal: function() {
+ this.setState({
+ modal: null,
+ });
+ },
render: function() {
return (
@@ -105,6 +114,31 @@ var ClaimCodePage = React.createClass({
+
+ Please enter an invitation code or choose "Skip."
+
+
+ Please enter an email address or choose "Skip."
+
+
+ {this.state.failureReason}
+
+
+ Your invite code has been redeemed.
+ {this.state.referralCredits > 0
+ ? `You have also earned {referralCredits} credits from referrals. A total of {activationCredits + referralCredits}
+ will be added to your balance shortly.`
+ : (this.state.activationCredits > 0
+ ? `{this.state.activationCredits} credits will be added to your balance shortly.`
+ : 'The credits will be added to your balance shortly.')}
+
+
+ Welcome to LBRY! You can visit the Wallet page to redeem an invite code at any time.
+
+
+
LBRY couldn't connect to our servers to confirm your invitation code. Please check your internet connection.
+ If you continue to have problems, you can still browse LBRY and visit the Settings page to redeem your code later.
+
);
}
diff --git a/js/page/my_files.js b/js/page/my_files.js
index fe60cbaa2..26d5fed42 100644
--- a/js/page/my_files.js
+++ b/js/page/my_files.js
@@ -5,31 +5,48 @@ var moreMenuStyle = {
right: '13px',
};
var MyFilesRowMoreMenu = React.createClass({
- onRevealClicked: function() {
+ propTypes: {
+ title: React.PropTypes.string.isRequired,
+ path: React.PropTypes.string.isRequired,
+ completed: React.PropTypes.bool.isRequired,
+ lbryUri: React.PropTypes.string.isRequired,
+ },
+ handleRevealClicked: function() {
lbry.revealFile(this.props.path);
},
- onRemoveClicked: function() {
+ handleRemoveClicked: function() {
lbry.deleteFile(this.props.lbryUri, false);
},
- onDeleteClicked: function() {
- var alertText = 'Are you sure you\'d like to delete "' + this.props.title + '?" This will ' +
- (this.completed ? ' stop the download and ' : '') +
- 'permanently remove the file from your system.';
-
- if (confirm(alertText)) {
- lbry.deleteFile(this.props.lbryUri);
- }
+ handleDeleteClicked: function() {
+ this.setState({
+ modal: 'confirmDelete',
+ });
+ },
+ handleDeleteConfirmed: function() {
+ lbry.deleteFile(this.props.lbryUri);
+ lbry.setState({
+ modal: null,
+ });
+ },
+ getInitialState: function() {
+ return {
+ modal: null,
+ };
},
render: function() {
return (
+
+ Are you sure you'd like to delete {this.props.title}? This will {this.props.completed ? ' stop the download and ' : ''}
+ permanently remove the file from your system.
+
);
}
@@ -123,8 +140,8 @@ var MyFilesRow = React.createClass({
}
diff --git a/js/page/publish.js b/js/page/publish.js
index a21d6516a..adb2adb29 100644
--- a/js/page/publish.js
+++ b/js/page/publish.js
@@ -81,14 +81,8 @@ var PublishPage = React.createClass({
console.log(publishArgs);
lbry.publish(publishArgs, (message) => {
this.handlePublishStarted();
- this.setState({
- submitting: false,
- });
}, null, (error) => {
this.handlePublishError(error);
- this.setState({
- submitting: false,
- });
});
};
@@ -125,18 +119,26 @@ var PublishPage = React.createClass({
otherLicenseUrl: '',
uploadProgress: 0.0,
uploaded: false,
+ errorMessage: null,
tempFileReady: false,
submitting: false,
+ modal: null,
};
},
handlePublishStarted: function() {
- alert(`Your file ${this.refs.meta_title.getValue()} has been published to LBRY at the address lbry://${this.state.name}!\n\n` +
- `You will now be taken to your My Files page, where your newly published file will be listed. Your file will take a few minutes to appear for other LBRY users; until then it will be listed as "pending."`);
+ this.setState({
+ modal: 'publishStarted',
+ });
+ },
+ handlePublishStartedConfirmed: function() {
window.location = "?published";
},
handlePublishError: function(error) {
- alert(`The following error occurred when attempting to publish your file:\n\n` +
- error.message);
+ this.setState({
+ submitting: false,
+ modal: 'error',
+ errorMessage: error.message,
+ });
},
handleNameChange: function(event) {
var rawName = event.target.value;
@@ -463,6 +465,14 @@ var PublishPage = React.createClass({
+
+
+
Your file has been published to LBRY at the address lbry://{this.state.name}!
+ You will now be taken to your My Files page, where your newly published file will be listed. The file will take a few minutes to appear for other LBRY users; until then it will be listed as "pending."
+
+
+ The following error occurred when attempting to publish your file: {this.state.errorMessage}
+
);
}
diff --git a/js/page/referral.js b/js/page/referral.js
index 0c7337d1d..4cbcf930d 100644
--- a/js/page/referral.js
+++ b/js/page/referral.js
@@ -14,6 +14,9 @@ var ReferralPage = React.createClass({
getInitialState: function() {
return {
submitting: false,
+ modal: null,
+ referralCredits: null,
+ failureReason: null,
}
},
handleSubmit: function(event) {
@@ -22,15 +25,17 @@ var ReferralPage = React.createClass({
}
if (!this.refs.code.value) {
- alert('Please enter a referral code.');
- return;
+ this.setState({
+ modal: 'missingCode',
+ });
} else if (!this.refs.email.value) {
- alert('Please enter an email address.');
- return;
+ this.setState({
+ modal: 'missingEmail',
+ });
}
this.setState({
- submitting: true
+ submitting: true,
});
lbry.getNewAddress((address) => {
@@ -42,29 +47,24 @@ var ReferralPage = React.createClass({
var response = JSON.parse(xhr.responseText);
if (response.success) {
- if (response.referralCredits > 0) {
- alert('You have earned ' + response.referralCredits + ' credits from referrals. ' +
- 'We will credit your account shortly. Thanks!');
- } else {
- alert('You have not earned any new referral credits since the last time you checked. ' +
- 'Please check back in a week or two.');
- }
-
- window.location = '?home';
- } else {
- alert(response.reason);
this.setState({
- submitting: false
+ modal: 'referralInfo',
+ referralCredits: response.referralCredits,
+ });
+ } else {
+ this.setState({
+ submitting: false,
+ modal: 'lookupFailed',
+ failureReason: response.reason,
});
}
});
xhr.addEventListener('error', () => {
this.setState({
- submitting: false
+ submitting: false,
+ modal: 'couldNotConnect',
});
- alert('LBRY couldn\'t connect to our servers to confirm your referral code. Please check your ' +
- 'internet connection.');
});
xhr.open('POST', 'https://invites.lbry.io/check', true);
@@ -73,6 +73,15 @@ var ReferralPage = React.createClass({
'&email=' + encodeURIComponent(email));
});
},
+ closeModal: function() {
+ this.setState({
+ modal: null,
+ });
+ },
+ handleFinished: function() {
+ localStorage.setItem('claimCodeDone', true);
+ window.location = '?home';
+ },
render: function() {
return (
@@ -94,6 +103,17 @@ var ReferralPage = React.createClass({
+
+ {this.state.referralCredits > 0
+ ? `You have earned {response.referralCredits} credits from referrals. We will credit your account shortly. Thanks!`
+ : 'You have not earned any new referral credits since the last time you checked. Please check back in a week or two.'}
+
+
+ {this.state.failureReason}
+
+
+ LBRY couldn't connect to our servers to confirm your referral code. Please check your internet connection.
+
);
}
diff --git a/js/page/report.js b/js/page/report.js
index af10ae71c..ac9751857 100644
--- a/js/page/report.js
+++ b/js/page/report.js
@@ -6,9 +6,9 @@ var ReportPage = React.createClass({
});
lbry.reportBug(this._messageArea.value, () => {
this.setState({
- submitting: false
+ submitting: false,
+ modal: 'submitted',
});
- alert("Your bug report has been submitted! Thank you for your feedback.");
});
this._messageArea.value = '';
}
@@ -16,9 +16,15 @@ var ReportPage = React.createClass({
componentDidMount: function() {
document.title = "Report an Issue";
},
+ closeModal: function() {
+ this.setState({
+ modal: null,
+ })
+ },
getInitialState: function() {
return {
submitting: false,
+ modal: null,
}
},
render: function() {
@@ -38,6 +44,9 @@ var ReportPage = React.createClass({
Developer?
You can also .
+
+ Your bug report has been submitted! Thank you for your feedback.
+
);
}
diff --git a/js/page/wallet.js b/js/page/wallet.js
index a6eaa690c..6f55d0876 100644
--- a/js/page/wallet.js
+++ b/js/page/wallet.js
@@ -17,6 +17,7 @@ var AddressSection = React.createClass({
getInitialState: function() {
return {
address: null,
+ modal: null,
}
},
componentWillMount: function() {
@@ -58,7 +59,9 @@ var SendToAddressSection = React.createClass({
if ((this.state.balance - this.state.amount) < 1)
{
- alert("Insufficient balance: after this transaction you would have less than 1 LBC in your wallet.")
+ this.setState({
+ modal: 'insufficientBalance',
+ });
return;
}
@@ -85,6 +88,11 @@ var SendToAddressSection = React.createClass({
})
});
},
+ closeModal: function() {
+ this.setState({
+ modal: null,
+ });
+ },
getInitialState: function() {
return {
address: "",
@@ -136,6 +144,9 @@ var SendToAddressSection = React.createClass({
: ''
}
+
+ Insufficient balance: after this transaction you would have less than 1 LBC in your wallet.
+
);
}
diff --git a/scss/_gui.scss b/scss/_gui.scss
index 09a1b950a..8db305454 100644
--- a/scss/_gui.scss
+++ b/scss/_gui.scss
@@ -132,6 +132,13 @@ input[type="text"], input[type="search"]
}
}
+.button-container {
+ + .button-container
+ {
+ margin-left: 12px;
+ }
+}
+
.button-block
{
cursor: pointer;
@@ -143,10 +150,6 @@ input[type="text"], input[type="search"]
text-align: center;
border-radius: 2px;
text-transform: uppercase;
- + .button-block
- {
- margin-left: 12px;
- }
.icon
{
top: 0em;
@@ -225,3 +228,43 @@ input[type="text"], input[type="search"]
margin-top: $spacing-vertical;
}
}
+
+.modal-overlay {
+ position: fixed;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ background-color: rgba(255, 255, 255, 0.74902);
+ z-index: 9999;
+}
+
+.modal {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ border: 1px solid rgb(204, 204, 204);
+ background: rgb(255, 255, 255);
+ overflow: auto;
+ border-radius: 4px;
+ outline: none;
+ padding: 40px;
+ max-width: 250px;
+}
+
+.modal__buttons {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ margin-top: 15px;
+}
+
+.modal__button {
+ margin: 0px 6px;
+}