Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

allow registration and login from guest to be cancellable #220

Merged
merged 3 commits into from
Mar 16, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 36 additions & 4 deletions src/components/structures/MatrixChat.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,10 +226,14 @@ module.exports = React.createClass({
switch (payload.action) {
case 'logout':
if (window.localStorage) {
var hsUrl = this.getCurrentHsUrl();
var isUrl = this.getCurrentIsUrl();
window.localStorage.clear();
// preserve our HS & IS URLs for convenience
window.localStorage.setItem("mx_hs_url", this.getCurrentHsUrl());
window.localStorage.setItem("mx_is_url", this.getCurrentIsUrl());
// N.B. we cache them in hsUrl/isUrl and can't really inline them
// as getCurrentHsUrl() may call through to localStorage.
window.localStorage.setItem("mx_hs_url", hsUrl);
window.localStorage.setItem("mx_is_url", isUrl);
}
Notifier.stop();
UserActivity.stop();
Expand Down Expand Up @@ -275,11 +279,31 @@ module.exports = React.createClass({
screen: 'post_registration'
});
break;
case 'start_login_from_guest':
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need to be a separate thing? ie. could start_login just do if (MatrixClientPeg.get().isGuest()) {... and if something explicitly wants to log out first, it can just post the logout action first?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, it could be combined together. i guess it was a choice of separating the two flows with an isGuest() or adding a different dispatch target. keeping it separate gives us the option of logging in without preserving the guest details if desired (e.g. if you explicitly wanted to replace your current session with a new login). i'm not sure that one is a huge win over the other, but yell if you feel strongly.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough, I don't really feel strongly.

this.replaceState({
screen: 'login',
guestCreds: { // stash our guest creds so we can backout if needed
userId: MatrixClientPeg.get().credentials.userId,
accessToken: MatrixClientPeg.get().getAccessToken(),
homeserverUrl: MatrixClientPeg.get().getHomeserverUrl(),
identityServerUrl: MatrixClientPeg.get().getIdentityServerUrl(),
guest: true
}
});
this.notifyNewScreen('login');
break;
case 'start_upgrade_registration':
this.replaceState({
screen: "register",
upgradeUsername: MatrixClientPeg.get().getUserIdLocalpart(),
guestAccessToken: MatrixClientPeg.get().getAccessToken()
guestAccessToken: MatrixClientPeg.get().getAccessToken(),
guestCreds: { // stash our guest creds so we can backout if needed
userId: MatrixClientPeg.get().credentials.userId,
accessToken: MatrixClientPeg.get().getAccessToken(),
homeserverUrl: MatrixClientPeg.get().getHomeserverUrl(),
identityServerUrl: MatrixClientPeg.get().getIdentityServerUrl(),
guest: true
}
});
this.notifyNewScreen('register');
break;
Expand Down Expand Up @@ -858,6 +882,11 @@ module.exports = React.createClass({
this.showScreen("forgot_password");
},

onReturnToGuestClick: function() {
// reanimate our guest login
this.onLoggedIn(this.state.guestCreds);
},

onRegistered: function(credentials) {
this.onLoggedIn(credentials);
// do post-registration stuff
Expand Down Expand Up @@ -1042,7 +1071,9 @@ module.exports = React.createClass({
registrationUrl={this.props.registrationUrl}
onLoggedIn={this.onRegistered}
onLoginClick={this.onLoginClick}
onRegisterClick={this.onRegisterClick} />
onRegisterClick={this.onRegisterClick}
onCancelClick={ MatrixClientPeg.get() && MatrixClientPeg.get().isGuest() ? this.onReturnToGuestClick : null }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does this work? Will this not hide the back-to-app div if the user does anything to cause the matrix client to be replaced, like changing home servers?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops, good catch. fixed.

/>
);
} else if (this.state.screen == 'forgot_password') {
return (
Expand All @@ -1065,6 +1096,7 @@ module.exports = React.createClass({
customIsUrl={this.getCurrentIsUrl()}
onForgotPasswordClick={this.onForgotPasswordClick}
onLoginAsGuestClick={this.props.enableGuest && this.props.config && this.props.config.default_hs_url ? this._registerAsGuest: undefined}
onCancelClick={ MatrixClientPeg.get() && MatrixClientPeg.get().isGuest() ? this.onReturnToGuestClick : null }
/>
);
}
Expand Down
11 changes: 11 additions & 0 deletions src/components/structures/login/Login.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ module.exports = React.createClass({displayName: 'Login',
// login shouldn't care how password recovery is done.
onForgotPasswordClick: React.PropTypes.func,
onLoginAsGuestClick: React.PropTypes.func,
onCancelClick: React.PropTypes.func,
},

getInitialState: function() {
Expand Down Expand Up @@ -211,6 +212,15 @@ module.exports = React.createClass({displayName: 'Login',
Login as guest
</a>
}

var returnToAppJsx;
if (this.props.onCancelClick) {
returnToAppJsx =
<a className="mx_Login_create" onClick={this.props.onCancelClick} href="#">
Return to app
</a>
}

return (
<div className="mx_Login">
<div className="mx_Login_box">
Expand All @@ -235,6 +245,7 @@ module.exports = React.createClass({displayName: 'Login',
Create a new account
</a>
{ loginAsGuestJsx }
{ returnToAppJsx }
<LoginFooter />
</div>
</div>
Expand Down
13 changes: 12 additions & 1 deletion src/components/structures/login/Registration.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ module.exports = React.createClass({
guestAccessToken: React.PropTypes.string,
disableUsernameChanges: React.PropTypes.bool,
// registration shouldn't know or care how login is done.
onLoginClick: React.PropTypes.func.isRequired
onLoginClick: React.PropTypes.func.isRequired,
onCancelClick: React.PropTypes.func
},

getInitialState: function() {
Expand Down Expand Up @@ -234,6 +235,15 @@ module.exports = React.createClass({
<Spinner />
);
}

var returnToAppJsx;
if (this.props.onCancelClick) {
returnToAppJsx =
<a className="mx_Login_create" onClick={this.props.onCancelClick} href="#">
Return to app
</a>
}

return (
<div>
<h2>Create an account</h2>
Expand All @@ -254,6 +264,7 @@ module.exports = React.createClass({
<a className="mx_Login_create" onClick={this.props.onLoginClick} href="#">
I already have an account
</a>
{ returnToAppJsx }
</div>
);
},
Expand Down