UNPKG

twreporter-redux

Version:

redux actions and reducers for twreporter website

136 lines (108 loc) 4.06 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchAFullTopic = fetchAFullTopic; exports.fetchTopics = fetchTopics; exports.fetchTopicsOnIndexPage = fetchTopicsOnIndexPage; var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var _get = require('lodash/get'); var _get2 = _interopRequireDefault(_get); var _actionTypes = require('../constants/action-types'); var _actionTypes2 = _interopRequireDefault(_actionTypes); var _reduxStateFields = require('../constants/redux-state-fields'); var _reduxStateFields2 = _interopRequireDefault(_reduxStateFields); var _apiEndpoints = require('../constants/api-endpoints'); var _apiEndpoints2 = _interopRequireDefault(_apiEndpoints); var _formApiUrl = require('../utils/form-api-url'); var _formApiUrl2 = _interopRequireDefault(_formApiUrl); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _ = { get: _get2.default /* Fetch a full topic, whose assets like relateds, leading_video ...etc are all complete, * @param {string} slug - slug of topic */ }; // lodash function fetchAFullTopic(slug) { return function (dispatch, getState) { var state = getState(); var topic = _.get(state, _reduxStateFields2.default.entities + '.' + _reduxStateFields2.default.topics + '.' + slug, {}); if (_.get(topic, 'full', false)) { return Promise.resolve(); } var url = _apiEndpoints2.default.topics + '/' + slug + '?full=true'; // Start to get topics dispatch({ type: _actionTypes2.default.START_TO_GET_A_FULL_TOPIC, url: url }); return _axios2.default.get((0, _formApiUrl2.default)(url)).then(function (response) { return dispatch({ type: _actionTypes2.default.GET_A_FULL_TOPIC, payload: _.get(response, 'data.record', {}) }); }).catch(function (error) { // Error to get topics return dispatch({ type: _actionTypes2.default.ERROR_TO_GET_A_FULL_TOPIC, error: error }); }); }; } function _fetchTopics(dispatch, url, successActionType) { // Start to get topics dispatch({ type: _actionTypes2.default.START_TO_GET_TOPICS }); return _axios2.default.get((0, _formApiUrl2.default)(url)).then(function (response) { return dispatch({ type: successActionType, payload: { items: _.get(response, 'data.records', []), total: _.get(response, 'data.meta.total', 0) } }); }).catch(function (error) { // Error to get topics return dispatch({ type: _actionTypes2.default.ERROR_TO_GET_TOPICS, error: error }); }); } /* Fetch topics(only containing meta properties), * and it will load more if (total > items you have currently). * @param {number} limit - the number of posts you want to get in one request */ function fetchTopics(limit) { return function (dispatch, getState) { var state = getState(); var topics = _.get(state, _reduxStateFields2.default.topics); // if topics already exsited and there is nothing more to load if (topics && _.get(topics, 'total', 0) <= _.get(topics, 'items.length', 0)) { return Promise.resolve(); } var offset = _.get(topics, 'items.length', 0); var path = _apiEndpoints2.default.topics + '?limit=' + limit + '&offset=' + offset; return _fetchTopics(dispatch, path, _actionTypes2.default.GET_TOPICS); }; } /** * fetchTopicsOnIndexPage * This function will fetch the 2 to 5 latest topics. * It's specifically made for index page */ function fetchTopicsOnIndexPage() { return function (dispatch, getState) { var state = getState(); var topics = _.get(state, _reduxStateFields2.default.indexPage + '.' + _reduxStateFields2.default.topics, []); if (Array.isArray(topics) && topics.length > 0) { return Promise.resolve(); } var path = _apiEndpoints2.default.topics + '?offset=1&limit=4'; return _fetchTopics(dispatch, path, _actionTypes2.default.GET_TOPICS_FOR_INDEX_PAGE); }; }