login & registration now functional

This commit is contained in:
Edin Dazdarevic
2015-03-03 19:11:38 +01:00
parent 4befef5bf4
commit 028bf79617
8 changed files with 189 additions and 71 deletions

View File

@@ -1,4 +1,8 @@
post '/user/logout' do
response.delete_cookie("ribica_auth", :path => "/")
end
post '/user/login' do post '/user/login' do
request.body.rewind request.body.rewind
login_details = JSON.parse(request.body.read) login_details = JSON.parse(request.body.read)

View File

@@ -1,64 +1,105 @@
var AppDispatcher = require('../dispatcher/appDispatcher'); var AppDispatcher = require('../dispatcher/appDispatcher');
var UserConstants = require('../constants/userConstants'); var UserConstants = require('../constants/userConstants');
var superagent = require('superagent');
var globals = require('../globals');
var NavigationActions = require('./navigationActions');
// Define action methods
var UserActions = { var UserActions = {
registerUser: function(user) { registerUser: function(user) {
AppDispatcher.handleAction({ AppDispatcher.handleAction({
actionType: UserConstants.REGISTER_USER, actionType: UserConstants.REGISTER_USER,
user: user user: user
}); });
user.save(null, { user.save(null, {
success: function() { success: function() {
UserActions.registrationSuccess(); UserActions.registrationSuccess();
}, },
error: function(model, response, options) { error: function(model, response, options) {
UserActions.registrationFailure(response); UserActions.registrationFailure(response);
} }
}); });
}, },
registrationSuccess: function() { registrationSuccess: function() {
AppDispatcher.handleAction({ AppDispatcher.handleAction({
actionType: UserConstants.REGISTRATION_SUCCESS actionType: UserConstants.REGISTRATION_SUCCESS
}); });
}, },
registrationFailure: function(error) { registrationFailure: function(error) {
AppDispatcher.handleAction({ AppDispatcher.handleAction({
actionType: UserConstants.REGISTRATION_FAILURE, actionType: UserConstants.REGISTRATION_FAILURE,
error: error error: error
}); });
}, },
userLogin: function(loginDetails) { userLogout:function() {
AppDispatcher.handleAction({ AppDispatcher.handleAction({
actionType: UserConstants.USER_LOGIN, actionType: UserConstants.USER_LOGOUT
loginDetails: loginDetails });
});
loginDetails.save(null, { superagent
success: function(){ .post(globals.ApiUrl + '/user/logout')
alert('ok') .withCredentials()
UserActions.loginSuccess(); .end(function(response){
}, UserActions.logoutDone();
});
},
logoutDone: function() {
AppDispatcher.handleAction({
actionType: UserConstants.USER_LOGOUT_DONE
});
},
userLogin: function(loginDetails) {
AppDispatcher.handleAction({
actionType: UserConstants.USER_LOGIN
});
error: function(model, response, options){ superagent.post(globals.ApiUrl + '/user/login')
alert('error!'); .withCredentials()
UserActions.loginFailure(response); .send(loginDetails)
} .end(function(response) {
}); if(response.unauthorized){
}, UserActions.loginFailure(response.body);
loginSuccess: function() { } else {
AppDispatcher.handleAction({ UserActions.loginSuccess(response.body);
actionType: UserConstants.LOGIN_SUCCESS }
}); });
}, },
loginFailure: function(error) { loginSuccess: function(user) {
AppDispatcher.handleAction({ AppDispatcher.handleAction({
actionType: UserConstants.LOGIN_FAILURE, actionType: UserConstants.LOGIN_SUCCESS,
error: error user: user
}); });
} },
loginFailure: function(error) {
AppDispatcher.handleAction({
actionType: UserConstants.LOGIN_FAILURE,
error: error
});
},
checkLogin: function() {
AppDispatcher.handleAction({
actionType: UserConstants.CHECK_LOGIN
});
superagent
.get(globals.ApiUrl + '/user')
.withCredentials()
.end(function(response){
if(response.unauthorized){
UserActions.checkLoginArrived(null, true);
} else {
UserActions.checkLoginArrived(response.body);
}
});
},
checkLoginArrived: function(user, error) {
AppDispatcher.handleAction({
actionType: UserConstants.CHECK_LOGIN_ARRIVED,
user: user,
error: error
});
}
}; };
module.exports = UserActions; module.exports = UserActions;

View File

@@ -17,13 +17,14 @@ var Login = React.createClass({
UserStore.removeChangeListener(this.onUserStoreChange); UserStore.removeChangeListener(this.onUserStoreChange);
}, },
onUserStoreChange: function() { onUserStoreChange: function() {
var loginState = UserStore.getLoginState(); if(this.isMounted()) {
var loginState = UserStore.getLoginState();
if (loginState.loggedIn) {
NavigationActions.goToHome();
} else {
this.setState({login: loginState}); this.setState({login: loginState});
if (loginState.loggedIn) {
setTimeout(function(){
NavigationActions.goToHome();
}, 0);
}
} }
}, },
getInitialState: function() { getInitialState: function() {

View File

@@ -2,11 +2,47 @@ var React = require("react"),
Router = require("react-router"), Router = require("react-router"),
Link = Router.Link; Link = Router.Link;
var UserStore = require('../../stores/userStore');
var UserActions = require('../../actions/userActions');
var LoginStatus = React.createClass({ var LoginStatus = React.createClass({
getInitialState: function() {
return UserStore.getLoginState();
},
componentDidMount: function() {
UserActions.checkLogin();
UserStore.addChangeListener(this.onUserStateChange);
},
componentWillReceiveProps: function() {
this.update();
},
componentWillUnmount: function() {
UserStore.removeChangeListener(this.onUserStateChange);
},
onUserStateChange: function() {
this.update();
},
update: function() {
this.setState(UserStore.getLoginState());
},
logout: function(e){
e.preventDefault();
UserActions.userLogout();
},
render : function() { render : function() {
return (<div>
var content;
if(this.state.loggedIn){
content = (<div>Dobrodosli, {this.state.user.first_name} {this.state.user.last_name} | <a onClick={this.logout}>Odjavite se</a>
</div>)
} else {
content = (<div>
<Link to="registracija">Registracija</Link> | <Link to="login">Prijava</Link> <Link to="registracija">Registracija</Link> | <Link to="login">Prijava</Link>
</div>); </div>)
}
return (<div>{content}</div>)
} }
}) })
module.exports = LoginStatus; module.exports = LoginStatus;

View File

@@ -7,5 +7,9 @@ module.exports = keyMirror({
REGISTRATION_FAILURE: null, REGISTRATION_FAILURE: null,
USER_LOGIN: null, USER_LOGIN: null,
LOGIN_SUCCESS: null, LOGIN_SUCCESS: null,
LOGIN_FAILURE: null LOGIN_FAILURE: null,
CHECK_LOGIN: null,
CHECK_LOGIN_ARRIVED: null,
USER_LOGOUT_DONE: null,
USER_LOGOUT: null
}); });

View File

@@ -30,14 +30,16 @@ var NavigationStore = _.extend({}, EventEmitter.prototype, {
// Register callback with AppDispatcher // Register callback with AppDispatcher
AppDispatcher.register(function(payload) { NavigationStore.dispatchToken = AppDispatcher.register(function(payload) {
var action = payload.action; var action = payload.action;
switch(action.actionType) { switch(action.actionType) {
case NavigationConstants.CHANGE_URL: case NavigationConstants.CHANGE_URL:
var router = require('../router'); var router = require('../router');
router.transitionTo(action.url); setTimeout(function(){
router.transitionTo(action.url);
}, 0);
break; break;
default: default:
@@ -50,4 +52,4 @@ AppDispatcher.register(function(payload) {
}); });
module.exports = NavigationStore; module.exports = NavigationStore;

View File

@@ -2,7 +2,7 @@ var AppDispatcher = require('../dispatcher/appDispatcher');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var UserConstants = require('../constants/userConstants'); var UserConstants = require('../constants/userConstants');
var _ = require('underscore'); var _ = require('underscore');
var NavigationActions = require('../actions/navigationActions');
var _registrationState = {}; var _registrationState = {};
var _loginState = {}; var _loginState = {};
@@ -21,10 +21,12 @@ var handleRegistrationFailure = function(error) {
}; };
}; };
var handleLoginSuccess = function() { var handleLoginSuccess = function(user) {
_loginState = { _loginState = {
loggedIn: true loggedIn: true,
user: user
}; };
}; };
var handleLoginFailure = function(error) { var handleLoginFailure = function(error) {
@@ -32,7 +34,29 @@ var handleLoginFailure = function(error) {
loggedIn: false, loggedIn: false,
error: error error: error
}; };
}; };
var handleCheckLoginArrived = function(user, error) {
if(user) {
_loginState = {
loggedIn: true,
user: user
};
} else{
_loginState = {
loggedIn: false
};
}
};
var handleLogoutDone = function() {
_loginState = {
loggedIn: false
}
};
// Extend SectionStore with EventEmitter to add eventing capabilities // Extend SectionStore with EventEmitter to add eventing capabilities
var UserStore = _.extend({}, EventEmitter.prototype, { var UserStore = _.extend({}, EventEmitter.prototype, {
@@ -76,12 +100,17 @@ AppDispatcher.register(function(payload) {
handleRegistrationFailure(action.error); handleRegistrationFailure(action.error);
break; break;
case UserConstants.LOGIN_SUCCESS: case UserConstants.LOGIN_SUCCESS:
handleLoginSuccess(); handleLoginSuccess(action.user);
break; break;
case UserConstants.LOGIN_FAILURE: case UserConstants.LOGIN_FAILURE:
handleLoginFailure(action.error); handleLoginFailure(action.error);
break; break;
case UserConstants.CHECK_LOGIN_ARRIVED:
handleCheckLoginArrived(action.user, action.error);
break;
case UserConstants.USER_LOGOUT_DONE:
handleLogoutDone();
break;
default: default:
return true; return true;
} }

View File

@@ -30,6 +30,7 @@
"backbone": "~1.1.2", "backbone": "~1.1.2",
"bootstrap": "~3.3.1", "bootstrap": "~3.3.1",
"jquery": "~2.1.3", "jquery": "~2.1.3",
"react-router": "~0.11.6" "react-router": "~0.11.6",
"superagent": "~0.21.0"
} }
} }