diff --git a/front-api/controllers/user.rb b/front-api/controllers/user.rb index 82058c5..b9ef02b 100644 --- a/front-api/controllers/user.rb +++ b/front-api/controllers/user.rb @@ -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) diff --git a/front-ui/app/actions/userActions.js b/front-ui/app/actions/userActions.js index 1df9eb1..594f67f 100644 --- a/front-ui/app/actions/userActions.js +++ b/front-ui/app/actions/userActions.js @@ -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; diff --git a/front-ui/app/components/account/login.js b/front-ui/app/components/account/login.js index 75e6af5..8494f1c 100644 --- a/front-ui/app/components/account/login.js +++ b/front-ui/app/components/account/login.js @@ -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() { diff --git a/front-ui/app/components/shared/loginStatus.js b/front-ui/app/components/shared/loginStatus.js index 235f20a..b98d668 100644 --- a/front-ui/app/components/shared/loginStatus.js +++ b/front-ui/app/components/shared/loginStatus.js @@ -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 (
+ + var content; + + if(this.state.loggedIn){ +content = (
Dobrodosli, {this.state.user.first_name} {this.state.user.last_name} | Odjavite se + +
) + } else { + content = (
Registracija | Prijava -
); +
) + } + return (
{content}
) } }) module.exports = LoginStatus; diff --git a/front-ui/app/constants/userConstants.js b/front-ui/app/constants/userConstants.js index eacd671..e9f7b61 100644 --- a/front-ui/app/constants/userConstants.js +++ b/front-ui/app/constants/userConstants.js @@ -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 }); diff --git a/front-ui/app/stores/navigationStore.js b/front-ui/app/stores/navigationStore.js index c9ec59b..ddee1f9 100644 --- a/front-ui/app/stores/navigationStore.js +++ b/front-ui/app/stores/navigationStore.js @@ -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; \ No newline at end of file +module.exports = NavigationStore; diff --git a/front-ui/app/stores/userStore.js b/front-ui/app/stores/userStore.js index db2cbbb..918ff3e 100644 --- a/front-ui/app/stores/userStore.js +++ b/front-ui/app/stores/userStore.js @@ -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; } diff --git a/front-ui/package.json b/front-ui/package.json index 2a05b2c..d214bdd 100644 --- a/front-ui/package.json +++ b/front-ui/package.json @@ -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" } }