Files
freeCodeCamp/common/app/Flash/redux/index.js

60 lines
1.4 KiB
JavaScript
Raw Normal View History

2018-01-04 16:24:03 -08:00
import _ from 'lodash/fp';
2018-01-04 16:39:43 -08:00
import {
createTypes,
createAction,
createAsyncTypes,
2018-01-04 16:39:43 -08:00
composeReducers,
handleActions
} from 'berkeleys-redux-utils';
2018-01-04 09:18:20 -08:00
import * as utils from './utils.js';
import getMessagesEpic from './get-messages-epic.js';
2018-01-04 16:24:03 -08:00
import ns from '../ns.json';
export const epics = [getMessagesEpic];
2018-01-08 11:12:00 -08:00
export const types = createTypes([
'clickOnClose',
createAsyncTypes('fetchMessages')
2018-01-08 11:12:00 -08:00
], ns);
export const clickOnClose = createAction(types.clickOnClose, _.noop);
export const fetchMessagesComplete = createAction(types.fetchMessages.complete);
export const fetchMessagesError = createAction(types.fetchMessages.error);
2018-01-08 11:12:00 -08:00
2018-01-09 14:35:04 -08:00
const defaultState = [];
2018-01-04 16:24:03 -08:00
const getNS = _.property(ns);
export const latestMessageSelector = _.flow(
getNS,
_.head,
2018-01-04 16:39:43 -08:00
_.defaultTo({})
2018-01-04 16:24:03 -08:00
);
export default composeReducers(
ns,
2018-01-04 16:39:43 -08:00
handleActions(
() => ({
2018-01-09 14:35:04 -08:00
[types.clickOnClose]: _.tail,
[types.fetchMessages.complete]: (state, { payload }) => [
2018-01-04 16:39:43 -08:00
...state,
...utils.expressToStack(payload)
2018-01-09 14:35:04 -08:00
]
2018-01-04 16:39:43 -08:00
}),
defaultState,
),
2018-01-04 16:24:03 -08:00
function metaReducer(state = defaultState, action) {
if (utils.isFlashAction(action)) {
const { payload: { alertType, message } } = utils.getFlashAction(action);
2018-01-09 14:35:04 -08:00
return [
2018-01-04 16:24:03 -08:00
...state,
2018-01-09 14:35:04 -08:00
{
alertType: utils.normalizeAlertType(alertType),
2018-01-09 14:35:04 -08:00
message: _.escape(message)
}
];
2018-01-04 16:24:03 -08:00
}
return state;
}
);