Split reducers into separate files

Use a model of reducer/action files for each component that has them, and make `reducer.js` be the one that imports and configures all of them. This modeling is based on a few examples I've seen which seemed to work for our current case, but I'm totally fine with splitting actions and reducers into separate directories if we'd like too.
This commit is contained in:
Matthew Taylor 2016-05-19 11:34:28 -04:00
parent 4017266327
commit b969c4e2ed
6 changed files with 116 additions and 123 deletions

View file

@ -2,7 +2,7 @@ var connect = require('react-redux').connect;
var omit = require('lodash.omit');
var React = require('react');
var actions = require('../../redux/actions.js');
var actions = require('../../redux/auth.js');
var Modal = require('../modal/modal.jsx');
var Registration = require('../registration/registration.jsx');

View file

@ -5,7 +5,7 @@ var ReactIntl = require('react-intl');
var FormattedMessage = ReactIntl.FormattedMessage;
var injectIntl = ReactIntl.injectIntl;
var actions = require('../../../redux/actions.js');
var actions = require('../../../redux/auth.js');
var Api = require('../../../mixins/api.jsx');
var Avatar = require('../../avatar/avatar.jsx');

View file

@ -4,7 +4,7 @@ var ReactDOM = require('react-dom');
var StoreProvider = require('react-redux').Provider;
var IntlProvider = require('./intl.jsx').IntlProvider;
var actions = require('../redux/actions.js');
var authActions = require('../redux/auth.js');
var reducer = require('../redux/reducer.js');
require('../main.scss');
@ -41,7 +41,7 @@ var render = function (jsx, element) {
);
// Get initial session
store.dispatch(actions.refreshSession());
store.dispatch(authActions.refreshSession());
};
module.exports = render;

View file

@ -1,83 +0,0 @@
var keyMirror = require('keymirror');
var api = require('../mixins/api.jsx').api;
var jar = require('../lib/jar.js');
var Types = keyMirror({
SET_SESSION: null,
SET_SESSION_ERROR: null,
SET_TOKEN: null,
SET_TOKEN_ERROR: null,
USE_TOKEN: null
});
var Actions = {
types: Types,
setSessionError: function (error) {
return {
type: Types.SET_SESSION_ERROR,
error: error
}
},
setSession: function (session) {
return {
type: Types.SET_SESSION,
session: session
}
},
refreshSession: function () {
return function (dispatch) {
api({
host: '',
uri: '/session/'
}, function (err, body) {
if (err) return dispatch(Actions.setSessionError(err));
if (typeof body !== 'undefined') {
if (body.banned) {
return window.location = url;
} else {
dispatch(Actions.getToken());
dispatch(Actions.setSession(body));
return;
}
}
});
};
},
getToken: function () {
return function (dispatch) {
jar.get('scratchsessionsid', function (err, value) {
if (err) return dispatch(Actions.setTokenError(err));
jar.unsign(value, function (err, contents) {
if (err) return dispatch(Actions.setTokenError(err));
try {
var sessionData = JSON.parse(contents);
} catch (err) {
return dispatch(Actions.setTokenError(err));
}
return dispatch(Actions.setToken(sessionData.token));
});
});
}
},
setToken: function (token) {
return {
type: Types.SET_TOKEN,
token: token
};
},
setTokenError: function (error) {
return {
type: Types.SET_SESSION_ERROR,
error: error
};
}
};
module.exports = Actions;

109
src/redux/auth.js Normal file
View file

@ -0,0 +1,109 @@
var keyMirror = require('keymirror');
var api = require('../mixins/api.jsx').api;
var jar = require('../lib/jar.js');
var Types = keyMirror({
SET_SESSION: null,
SET_SESSION_ERROR: null,
SET_TOKEN: null,
SET_TOKEN_ERROR: null,
USE_TOKEN: null
});
module.exports.sessionReducer = function (state, action) {
// Reducer for handling changes to session state
if (typeof state === 'undefined') {
state = {};
}
switch (action.type) {
case Types.SET_SESSION:
return action.session;
case Types.SET_SESSION_ERROR:
// TODO: do something with action.error
return state;
default:
return state;
}
};
module.exports.tokenReducer = function (state, action) {
// Reducer for updating the api token
if (typeof state === 'undefined') {
state = '';
}
switch (action.type) {
case Types.SET_TOKEN:
return action.token;
case Types.SET_TOKEN_ERROR:
// TODO: do something with the error
return state;
default:
return state;
}
};
module.exports.setSessionError = function (error) {
return {
type: Types.SET_SESSION_ERROR,
error: error
};
};
module.exports.setSession = function (session) {
return {
type: Types.SET_SESSION,
session: session
};
};
module.exports.refreshSession = function () {
return function (dispatch) {
api({
host: '',
uri: '/session/'
}, function (err, body) {
if (err) return dispatch(module.exports.setSessionError(err));
if (typeof body !== 'undefined') {
if (body.banned) {
return window.location = body.url;
} else {
dispatch(module.exports.getToken());
dispatch(module.exports.setSession(body));
return;
}
}
});
};
};
module.exports.getToken = function () {
return function (dispatch) {
jar.get('scratchsessionsid', function (err, value) {
if (err) return dispatch(module.exports.setTokenError(err));
jar.unsign(value, function (err, contents) {
if (err) return dispatch(module.exports.setTokenError(err));
try {
var sessionData = JSON.parse(contents);
} catch (err) {
return dispatch(module.exports.setTokenError(err));
}
return dispatch(module.exports.setToken(sessionData.token));
});
});
};
};
module.exports.setToken = function (token) {
return {
type: Types.SET_TOKEN,
token: token
};
};
module.exports.setTokenError = function (error) {
return {
type: Types.SET_SESSION_ERROR,
error: error
};
};

View file

@ -1,43 +1,10 @@
var combineReducers = require('redux').combineReducers;
var actionTypes = require('./actions.js').types;
var sessionReducer = function (state, action) {
// Reducer for handling changes to session state
if (typeof state === 'undefined') {
state = {};
}
switch (action.type) {
case actionTypes.SET_SESSION:
return action.session;
case actionTypes.SET_SESSION_ERROR:
// TODO: do something with action.error
return state;
default:
return state;
}
};
var tokenReducer = function (state, action) {
// Reducer for updating the api token
if (typeof state === 'undefined') {
state = '';
}
switch (action.type) {
case actionTypes.SET_TOKEN:
return action.token;
case actionTypes.SET_TOKEN_ERROR:
// TODO: do something with the error
return state;
default:
return state;
}
};
var authReducers = require('./auth.js');
var appReducer = combineReducers({
session: sessionReducer,
token: tokenReducer
session: authReducers.sessionReducer,
token: authReducers.tokenReducer,
});
module.exports = appReducer;