twreporter-redux
Version:
redux actions and reducers for twreporter website
206 lines (161 loc) • 6.88 kB
JavaScript
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);
};
}
;