From 9e0ab7d2a19a243933953c0646b6df58dcae7a35 Mon Sep 17 00:00:00 2001 From: Riley Davis Date: Tue, 20 Dec 2016 15:47:27 -0700 Subject: [PATCH] load actions in a reducer --- client/coral-admin/src/actions/comments.js | 28 ++++++++++--------- client/coral-admin/src/constants/actions.js | 1 + client/coral-admin/src/constants/comments.js | 6 ++-- .../ModerationQueue/ModerationQueue.js | 5 +++- client/coral-admin/src/reducers/actions.js | 24 ++++++++++++++++ client/coral-admin/src/reducers/comments.js | 2 +- client/coral-admin/src/reducers/index.js | 2 ++ 7 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 client/coral-admin/src/constants/actions.js create mode 100644 client/coral-admin/src/reducers/actions.js diff --git a/client/coral-admin/src/actions/comments.js b/client/coral-admin/src/actions/comments.js index e755f1ed1..66543ef36 100644 --- a/client/coral-admin/src/actions/comments.js +++ b/client/coral-admin/src/actions/comments.js @@ -1,10 +1,11 @@ import coralApi from '../../../coral-framework/helpers/response'; -import * as commentActions from '../constants/comments'; +import * as commentTypes from '../constants/comments'; +import * as actionTypes from '../constants/actions'; // Get comments to fill each of the three lists on the mod queue export const fetchModerationQueueComments = () => { return dispatch => { - dispatch({type: commentActions.COMMENTS_MODERATION_QUEUE_FETCH}); + dispatch({type: commentTypes.COMMENTS_MODERATION_QUEUE_FETCH}); return Promise.all([ coralApi('/queue/comments/pending'), coralApi('/comments?status=rejected'), @@ -20,11 +21,12 @@ export const fetchModerationQueueComments = () => { actions: [...pending.actions, ...rejected.actions, ...flagged.actions] }; }) - .then(({comments, users}) => { + .then(({comments, users, actions}) => { /* Post comments and users to redux store. Actions will be posted when they are needed. */ - dispatch({type: commentActions.USERS_MODERATION_QUEUE_FETCH_SUCCESS, users}); - dispatch({type: commentActions.COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS, comments}); + dispatch({type: commentTypes.USERS_MODERATION_QUEUE_FETCH_SUCCESS, users}); + dispatch({type: commentTypes.COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS, comments}); + dispatch({type: actionTypes.ACTIONS_MODERATION_QUEUE_FETCH_SUCCESS, actions}); }); }; @@ -35,8 +37,8 @@ export const createComment = (name, body) => { return dispatch => { const comment = {body, name}; return coralApi('/comments', {method: 'POST', comment}) - .then(res => dispatch({type: commentActions.COMMENT_CREATE_SUCCESS, comment: res})) - .catch(error => dispatch({type: commentActions.COMMENT_CREATE_FAILED, error})); + .then(res => dispatch({type: commentTypes.COMMENT_CREATE_SUCCESS, comment: res})) + .catch(error => dispatch({type: commentTypes.COMMENT_CREATE_FAILED, error})); }; }; @@ -47,23 +49,23 @@ export const createComment = (name, body) => { // Update a comment. Now to update a comment we need to send back the whole object export const updateStatus = (status, comment) => { return dispatch => { - dispatch({type: commentActions.COMMENT_STATUS_UPDATE, id: comment.id, status}); + dispatch({type: commentTypes.COMMENT_STATUS_UPDATE_REQUEST, id: comment.id, status}); return coralApi(`/comments/${comment.id}/status`, {method: 'PUT', body: {status}}) - .then(res => dispatch({type: commentActions.COMMENT_UPDATE_SUCCESS, res})) - .catch(error => dispatch({type: commentActions.COMMENT_UPDATE_FAILED, error})); + .then(res => dispatch({type: commentTypes.COMMENT_STATUS_UPDATE_SUCCESS, res})) + .catch(error => dispatch({type: commentTypes.COMMENT_STATUS_UPDATE_FAILURE, error})); }; }; export const flagComment = id => (dispatch, getState) => { - dispatch({type: commentActions.COMMENT_FLAG, id}); + dispatch({type: commentTypes.COMMENT_FLAG, id}); dispatch({type: 'COMMENT_UPDATE', comment: getState().comments.get('byId').get(id)}); }; // Dialog Actions export const showBanUserDialog = (userId, userName, commentId) => { - return {type: commentActions.SHOW_BANUSER_DIALOG, userId, userName, commentId}; + return {type: commentTypes.SHOW_BANUSER_DIALOG, userId, userName, commentId}; }; export const hideBanUserDialog = (showDialog) => { - return {type: commentActions.HIDE_BANUSER_DIALOG, showDialog}; + return {type: commentTypes.HIDE_BANUSER_DIALOG, showDialog}; }; diff --git a/client/coral-admin/src/constants/actions.js b/client/coral-admin/src/constants/actions.js new file mode 100644 index 000000000..d64c62d26 --- /dev/null +++ b/client/coral-admin/src/constants/actions.js @@ -0,0 +1 @@ +export const ACTIONS_MODERATION_QUEUE_FETCH_SUCCESS = 'ACTIONS_MODERATION_QUEUE_FETCH_SUCCESS'; diff --git a/client/coral-admin/src/constants/comments.js b/client/coral-admin/src/constants/comments.js index c75911587..ea15a24c3 100644 --- a/client/coral-admin/src/constants/comments.js +++ b/client/coral-admin/src/constants/comments.js @@ -7,7 +7,7 @@ export const COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS = 'COMMENTS_MODERATION_QUEU export const COMMENT_CREATE_SUCCESS = 'COMMENT_CREATE_SUCCESS'; export const COMMENT_CREATE_FAILED = 'COMMENT_CREATE_FAILED'; export const COMMENT_STREAM_FETCH_SUCCESS = 'COMMENT_STREAM_FETCH_SUCCESS'; -export const COMMENT_UPDATE_SUCCESS = 'COMMENT_UPDATE_SUCCESS'; -export const COMMENT_UPDATE_FAILED = 'COMMENT_UPDATE_FAILED'; -export const COMMENT_STATUS_UPDATE = 'COMMENT_STATUS_UPDATE'; +export const COMMENT_STATUS_UPDATE_SUCCESS = 'COMMENT_STATUS_UPDATE_SUCCESS'; +export const COMMENT_STATUS_UPDATE_FAILURE = 'COMMENT_STATUS_UPDATE_FAILURE'; +export const COMMENT_STATUS_UPDATE_REQUEST = 'COMMENT_STATUS_UPDATE_REQUEST'; export const COMMENT_FLAG = 'COMMENT_FLAG'; diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js index 451d53a3a..2e59e20ee 100644 --- a/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js +++ b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js @@ -86,10 +86,12 @@ class ModerationQueue extends React.Component { // Render the tabbed lists moderation queues render () { - const {comments, users, settings} = this.props; + const {comments, users, settings, actions} = this.props; const {activeTab, singleView, modalOpen} = this.state; console.log('ModerationQueue comments', comments); + console.log('settings', settings); + console.log('actions', actions); const premodIds = comments.ids.filter(id => comments.byId[id].status === 'premod'); const rejectedIds = comments.ids.filter(id => comments.byId[id].status === 'rejected'); @@ -158,6 +160,7 @@ class ModerationQueue extends React.Component { } const mapStateToProps = state => ({ + actions: state.actions.toJS(), settings: state.settings.toJS(), comments: state.comments.toJS(), users: state.users.toJS() diff --git a/client/coral-admin/src/reducers/actions.js b/client/coral-admin/src/reducers/actions.js new file mode 100644 index 000000000..709de5257 --- /dev/null +++ b/client/coral-admin/src/reducers/actions.js @@ -0,0 +1,24 @@ +import {Map, Set} from 'immutable'; +import * as types from '../constants/actions'; + +const initialState = Map({ + ids: Set() +}); + +export default (state = initialState, action) => { + switch (action.type) { + case types.ACTIONS_MODERATION_QUEUE_FETCH_SUCCESS: return addActions(state, action); + default: + return state; + } +}; + +const addActions = (state, action) => { + const ids = action.actions.map(action => action.item_id); + const map = action.actions.reduce((memo, action) => { + memo[action.item_id] = action; + return memo; + }, {}); + const newIds = state.get('ids').concat(ids); + return state.merge(map).set('ids', newIds); +}; diff --git a/client/coral-admin/src/reducers/comments.js b/client/coral-admin/src/reducers/comments.js index 2856b0a34..62a8f81a0 100644 --- a/client/coral-admin/src/reducers/comments.js +++ b/client/coral-admin/src/reducers/comments.js @@ -27,7 +27,7 @@ export default (state = initialState, action) => { case actions.COMMENTS_MODERATION_QUEUE_FETCH: return state.set('loading', true); case actions.COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS: return replaceComments(action, state); case actions.COMMENTS_MODERATION_QUEUE_FAILED: return state.set('loading', false); - case actions.COMMENT_STATUS_UPDATE: return updateStatus(state, action); + case actions.COMMENT_STATUS_UPDATE_REQUEST: return updateStatus(state, action); case actions.COMMENT_FLAG: return flag(state, action); case actions.COMMENT_CREATE_SUCCESS: return addComment(state, action); case actions.COMMENT_STREAM_FETCH_SUCCESS: return replaceComments(action, state); diff --git a/client/coral-admin/src/reducers/index.js b/client/coral-admin/src/reducers/index.js index 1f1b444fc..a28e23aec 100644 --- a/client/coral-admin/src/reducers/index.js +++ b/client/coral-admin/src/reducers/index.js @@ -4,6 +4,7 @@ import settings from 'reducers/settings'; import community from 'reducers/community'; import users from 'reducers/users'; import auth from 'reducers/auth'; +import actions from 'reducers/actions'; // Combine all reducers into a main one export default combineReducers({ @@ -11,5 +12,6 @@ export default combineReducers({ comments, community, auth, + actions, users });