twreporter-redux
Version:
redux actions and reducers for twreporter website
136 lines (108 loc) • 4.06 kB
JavaScript
'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);
};
}