UNPKG

twreporter-redux

Version:

redux actions and reducers for twreporter website

206 lines (161 loc) 6.88 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchAFullPost = fetchAFullPost; exports.fetchListedPosts = fetchListedPosts; exports.fetchEditorPickedPosts = fetchEditorPickedPosts; exports.fetchPhotographyPostsOnIndexPage = fetchPhotographyPostsOnIndexPage; exports.fetchInfographicPostsOnIndexPage = fetchInfographicPostsOnIndexPage; var _apiEndpoints = require('../constants/api-endpoints'); var _apiEndpoints2 = _interopRequireDefault(_apiEndpoints); var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var _reduxStateFields = require('../constants/redux-state-fields'); var _reduxStateFields2 = _interopRequireDefault(_reduxStateFields); var _formApiUrl = require('../utils/form-api-url'); var _formApiUrl2 = _interopRequireDefault(_formApiUrl); var _postStyles = require('../constants/post-styles'); var _postStyles2 = _interopRequireDefault(_postStyles); var _actionTypes = require('../constants/action-types'); var _actionTypes2 = _interopRequireDefault(_actionTypes); var _get = require('lodash/get'); var _get2 = _interopRequireDefault(_get); 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; } // lodash var _ = { get: _get2.default, merge: _merge2.default /* Fetch a full post, whose assets like relateds, leading_video ...etc are all complete, * @param {string} slug - slug of post */ };function fetchAFullPost(slug) { return function (dispatch, getState) { var state = getState(); var post = _.get(state, _reduxStateFields2.default.entities + '.' + _reduxStateFields2.default.posts + '.' + slug, {}); if (_.get(post, 'full', false)) { return Promise.resolve(); } var path = _apiEndpoints2.default.posts + '/' + slug + '?full=true'; var url = (0, _formApiUrl2.default)(path); // Start to get topics dispatch({ type: _actionTypes2.default.START_TO_GET_A_FULL_POST, url: url }); return _axios2.default.get(url).then(function (response) { return dispatch({ type: _actionTypes2.default.GET_A_FULL_POST, payload: _.get(response, 'data.record', {}) }); }).catch(function (error) { // Error to get topics return dispatch({ type: _actionTypes2.default.ERROR_TO_GET_A_FULL_POST, error: error }); }); }; } /* * @param {function} dispatch - dispatch of redux * @param {string} path - uri * @param {string} successActionType - action type * @param {string} failureActionType - action type * @param {object} defaultPayload */ function _fetchPosts(dispatch, path, successActionType) { var failureActionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _actionTypes2.default.ERROR_TO_GET_POSTS; var defaultPayload = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var url = (0, _formApiUrl2.default)(path); dispatch({ type: _actionTypes2.default.START_TO_GET_POSTS, url: url }); return _axios2.default.get(url).then(function (response) { return dispatch({ type: successActionType, payload: _.merge({ items: _.get(response, 'data.records', []), total: _.get(response, 'data.meta.total', 0) }, defaultPayload) }); }).catch(function (error) { // Error to get topics return dispatch(_.merge({ type: failureActionType, error: error }, defaultPayload)); }); } /* Fetch a listed posts(only containing meta properties), * such as the posts belonging to the same tag/category/topic. * @param {string} listID - id of the tag, category or topic * @param {string} listType - tags, categories or topics * @param {number} limit - the number of posts you want to get in one request */ function fetchListedPosts(listID, listType) { var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10; return function (dispatch, getState) { var state = getState(); var list = _.get(state, [_reduxStateFields2.default.lists, listID]); // if list is already existed and there is nothing more to load if (list && _.get(list, 'total', 0) <= _.get(list, 'items.length', 0)) { return Promise.resolve(); } var where = _defineProperty({}, listType, { in: [listID] }); var offset = _.get(list, 'items.length', 0); var path = _apiEndpoints2.default.posts + '?where=' + JSON.stringify(where) + '&limit=' + limit + '&offset=' + offset; return _fetchPosts(dispatch, path, _actionTypes2.default.GET_LISTED_POSTS, _actionTypes2.default.ERROR_TO_GET_LISTED_POSTS, { listID: listID }); }; } /** Fetch those posts picked by editors */ function fetchEditorPickedPosts() { return function (dispatch, getState) { var state = getState(); var posts = _.get(state, _reduxStateFields2.default.indexPage + '.' + _reduxStateFields2.default.editorPicks, []); if (posts.length > 0) { return Promise.resolve(); } var path = _apiEndpoints2.default.posts + '?where={"is_featured":true}&limit=6'; return _fetchPosts(dispatch, path, _actionTypes2.default.GET_EDITOR_PICKED_POSTS); }; } /** * fetchPhotographyPostsOnIndexPage * This function will fetch 10 latest posts with photography style, * It's specifically made for index page */ function fetchPhotographyPostsOnIndexPage() { return function (dispatch, getState) { var state = getState(); var posts = _.get(state, _reduxStateFields2.default.indexPage + '.' + _reduxStateFields2.default.photos, []); if (Array.isArray(posts) && posts.length > 0) { return Promise.resolve(); } var path = _apiEndpoints2.default.posts + '?where={"style":"' + _postStyles2.default.photography + '"}&limit=10'; return _fetchPosts(dispatch, path, _actionTypes2.default.GET_PHOTOGRAPHY_POSTS_FOR_INDEX_PAGE); }; } /** * fetchInfographicPostsOnIndexPage * This function will fetch 10 latest posts with interactive style, * It's specifically made for index page */ function fetchInfographicPostsOnIndexPage() { return function (dispatch, getState) { var state = getState(); var posts = _.get(state, _reduxStateFields2.default.indexPage + '.' + _reduxStateFields2.default.infographics, []); if (Array.isArray(posts) && posts.length > 0) { return Promise.resolve(); } var path = _apiEndpoints2.default.posts + '?where={"style":"' + _postStyles2.default.infographic + '"}&limit=10'; return _fetchPosts(dispatch, path, _actionTypes2.default.GET_INFOGRAPHIC_POSTS_FOR_INDEX_PAGE); }; }