mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2025-02-17 00:21:20 -05:00
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:
parent
4017266327
commit
b969c4e2ed
6 changed files with 116 additions and 123 deletions
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
109
src/redux/auth.js
Normal 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
|
||||
};
|
||||
};
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue