UNPKG

twreporter-redux

Version:

redux actions and reducers for twreporter website

248 lines (201 loc) 7.82 kB
'use strict'; 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;