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
request.body.rewind
login_details = JSON.parse(request.body.read)

View File

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

View File

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

View File

@@ -2,11 +2,47 @@ var React = require("react"),
Router = require("react-router"),
Link = Router.Link;
var UserStore = require('../../stores/userStore');
var UserActions = require('../../actions/userActions');
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() {
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>
</div>);
</div>)
}
return (<div>{content}</div>)
}
})
module.exports = LoginStatus;

View File

@@ -7,5 +7,9 @@ module.exports = keyMirror({
REGISTRATION_FAILURE: null,
USER_LOGIN: 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
AppDispatcher.register(function(payload) {
NavigationStore.dispatchToken = AppDispatcher.register(function(payload) {
var action = payload.action;
switch(action.actionType) {
case NavigationConstants.CHANGE_URL:
var router = require('../router');
router.transitionTo(action.url);
setTimeout(function(){
router.transitionTo(action.url);
}, 0);
break;
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 UserConstants = require('../constants/userConstants');
var _ = require('underscore');
var NavigationActions = require('../actions/navigationActions');
var _registrationState = {};
var _loginState = {};
@@ -21,10 +21,12 @@ var handleRegistrationFailure = function(error) {
};
};
var handleLoginSuccess = function() {
var handleLoginSuccess = function(user) {
_loginState = {
loggedIn: true
loggedIn: true,
user: user
};
};
var handleLoginFailure = function(error) {
@@ -32,7 +34,29 @@ var handleLoginFailure = function(error) {
loggedIn: false,
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
var UserStore = _.extend({}, EventEmitter.prototype, {
@@ -76,12 +100,17 @@ AppDispatcher.register(function(payload) {
handleRegistrationFailure(action.error);
break;
case UserConstants.LOGIN_SUCCESS:
handleLoginSuccess();
handleLoginSuccess(action.user);
break;
case UserConstants.LOGIN_FAILURE:
handleLoginFailure(action.error);
break;
case UserConstants.CHECK_LOGIN_ARRIVED:
handleCheckLoginArrived(action.user, action.error);
break;
case UserConstants.USER_LOGOUT_DONE:
handleLogoutDone();
break;
default:
return true;
}

View File

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