twreporter-redux
Version:
redux actions and reducers for twreporter website
248 lines (201 loc) • 7.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /* eslint no-param-reassign: ["error", { "props": false }]*/
// lodash
var _reduxStateFields = require('../constants/redux-state-fields');
var _reduxStateFields2 = _interopRequireDefault(_reduxStateFields);
var _actionTypes = require('../constants/action-types');
var _actionTypes2 = _interopRequireDefault(_actionTypes);
var _clone = require('lodash/clone');
var _clone2 = _interopRequireDefault(_clone);
var _get = require('lodash/get');
var _get2 = _interopRequireDefault(_get);
var _map = require('lodash/map');
var _map2 = _interopRequireDefault(_map);
var _merge = require('lodash/merge');
var _merge2 = _interopRequireDefault(_merge);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _ = {
get: _get2.default,
clone: _clone2.default,
map: _map2.default,
merge: _merge2.default
};
function putEntities() {
var entityArr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var entityMap = arguments[1];
var _entities = entityArr;
if (!Array.isArray(entityArr)) {
_entities = [entityArr];
}
_entities.forEach(function (entity) {
if ((typeof entity === 'undefined' ? 'undefined' : _typeof(entity)) !== 'object') {
return;
}
var slug = _.get(entity, 'slug');
var isFull = _.get(entity, 'full', false);
if (!Object.prototype.hasOwnProperty.call(entityMap, slug) || isFull) {
entityMap[slug] = entity;
}
});
}
// This will normalize the posts and topics.
// EX:
// action = {
// latest: [{
// slug: 'post_1'
// is_feature: false,
// style: 'article'
// }, {
// slug: 'post_2'
// is_feature: false,
// style: 'article'
// }],
// editor_picks: [{
// slug: 'post_3',
// is_feature: true
// style: 'article'
// }],
// reviews: [{
// slug: 'post_4',
// is_feature: false
// style: 'review'
// }],
// latest_topics: {
// slug: 'topic_1',
// relateds: [{
// slug: 'post_5'
// is_feature: false
// style: 'article'
// },{
// slug: 'post_6'
// is_feature: false
// style: 'article'
// }]
// }
// }
//
// the result will be
// {
// posts: {
// 'post_1': {
// slug: 'post_1'
// is_feature: false,
// style: 'article'
// },
// 'post_2': {
// slug: 'post_2'
// is_feature: false,
// style: 'article'
// },
// 'post_3': {
// slug: 'post_3'
// is_feature: true,
// style: 'article'
// },
// 'post_4': {
// slug: 'post_4'
// is_feature: false,
// style: 'review'
// },
// 'post_5': {
// slug: 'post_5'
// is_feature: false,
// style: 'article'
// },
// 'post_6': {
// slug: 'post_6'
// is_feature: false,
// style: 'article'
// },
// },
// topics: {
// 'topic_1': {
// slug: 'topic_1',
// relateds: [ 'post_5', 'post_6']
// }
// }
// }
function entities() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var postEntityMap = _.clone(_.get(state, _reduxStateFields2.default.posts, {}));
var topicEntityMap = _.clone(_.get(state, _reduxStateFields2.default.topics, {}));
var payload = void 0;
switch (action.type) {
case _actionTypes2.default.GET_CONTENT_FOR_INDEX_PAGE:
{
var _$merge;
payload = action.payload;
putEntities(_.get(payload, _reduxStateFields2.default.latest, []), postEntityMap);
putEntities(_.get(payload, _reduxStateFields2.default.editorPicks, []), postEntityMap);
putEntities(_.get(payload, _reduxStateFields2.default.reviews, []), postEntityMap);
putEntities(_.get(payload, _reduxStateFields2.default.photos, []), postEntityMap);
putEntities(_.get(payload, _reduxStateFields2.default.infographics, []), postEntityMap);
var latestTopic = _.get(payload, [_reduxStateFields2.default.latestTopic, 0], []);
var relatedPostsInTopic = _.get(latestTopic, _reduxStateFields2.default.relateds, []);
latestTopic[_reduxStateFields2.default.relateds] = _.map(relatedPostsInTopic, function (post) {
return _.get(post, 'slug');
});
putEntities(relatedPostsInTopic, postEntityMap);
putEntities(latestTopic, topicEntityMap);
var topics = _.get(payload, _reduxStateFields2.default.topics, []);
putEntities(topics, topicEntityMap);
return _.merge({}, state, (_$merge = {}, _defineProperty(_$merge, _reduxStateFields2.default.posts, postEntityMap), _defineProperty(_$merge, _reduxStateFields2.default.topics, topicEntityMap), _$merge));
}
case _actionTypes2.default.GET_TOPICS_FOR_INDEX_PAGE:
{
// topics we get from api
payload = _.get(action, 'payload.items', []);
putEntities(payload, topicEntityMap);
return _.merge({}, state, _defineProperty({}, _reduxStateFields2.default.topics, topicEntityMap));
}
case _actionTypes2.default.GET_EDITOR_PICKED_POSTS:
case _actionTypes2.default.GET_PHOTOGRAPHY_POSTS_FOR_INDEX_PAGE:
case _actionTypes2.default.GET_INFOGRAPHIC_POSTS_FOR_INDEX_PAGE:
case _actionTypes2.default.GET_LISTED_POSTS:
{
// topics we get from api
payload = _.get(action, 'payload.items', []);
putEntities(payload, postEntityMap);
return _.merge({}, state, _defineProperty({}, _reduxStateFields2.default.posts, postEntityMap));
}
case _actionTypes2.default.GET_A_FULL_POST:
{
var _$merge4;
var post = _.get(action, 'payload', {});
var topic = _.get(post, _reduxStateFields2.default.topics, {});
putEntities(topic, topicEntityMap);
post[_reduxStateFields2.default.topics] = _.get(topic, 'slug');
var relatedPosts = _.get(post, _reduxStateFields2.default.relateds, []);
post[_reduxStateFields2.default.relateds] = _.map(relatedPosts, function (_post) {
return _.get(_post, 'slug');
});
putEntities(relatedPosts, postEntityMap);
// set full post into post entities
putEntities([post], postEntityMap);
return _.merge({}, state, (_$merge4 = {}, _defineProperty(_$merge4, _reduxStateFields2.default.posts, postEntityMap), _defineProperty(_$merge4, _reduxStateFields2.default.topics, topicEntityMap), _$merge4));
}
case _actionTypes2.default.GET_A_FULL_TOPIC:
{
var _$merge5;
var _topic = _.get(action, 'payload', {});
var _relatedPosts = _.get(_topic, _reduxStateFields2.default.relateds, []);
_topic[_reduxStateFields2.default.relateds] = _.map(_relatedPosts, function (post) {
return _.get(post, 'slug');
});
putEntities(_relatedPosts, postEntityMap);
// set full topic into topic entities
putEntities([_topic], topicEntityMap);
return _.merge({}, state, (_$merge5 = {}, _defineProperty(_$merge5, _reduxStateFields2.default.posts, postEntityMap), _defineProperty(_$merge5, _reduxStateFields2.default.topics, topicEntityMap), _$merge5));
}
default:
{
return state;
}
}
}
exports.default = entities;