twreporter-react
Version:
React-Redux site for The Reporter Foundation in Taiwan
427 lines (350 loc) • 14.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fetchArticlesByIdsIfNeeded = fetchArticlesByIdsIfNeeded;
exports.fetchArticlesByTopicIdIfNeeded = fetchArticlesByTopicIdIfNeeded;
exports.fetchArticlesByTagIdIfNeeded = fetchArticlesByTagIdIfNeeded;
exports.fetchArticlesByCatIdIfNeeded = fetchArticlesByCatIdIfNeeded;
exports.fetchArticlesByTopicIdNameIfNeeded = fetchArticlesByTopicIdNameIfNeeded;
exports.fetchArticlesByCatNameIfNeeded = fetchArticlesByCatNameIfNeeded;
exports.fetchArticlesByTagNameIfNeeded = fetchArticlesByTagNameIfNeeded;
var _customError = require('../lib/custom-error');
var _normalizr = require('normalizr');
var _index = require('../schemas/index');
var _humps = require('humps');
var _listId = require('../conf/list-id');
var _index2 = require('../utils/index');
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _actionTypes = require('../constants/action-types');
var types = _interopRequireWildcard(_actionTypes);
var _isomorphicFetch = require('isomorphic-fetch');
var _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);
var _qs = require('qs');
var _qs2 = _interopRequireDefault(_qs);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
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; }
function requestArticlesByTagId(ids) {
return {
type: types.FETCH_ARTICLES_BY_TAG_ID_REQUEST,
id: _lodash2.default.get(ids, 0)
};
}
function failToReceiveArticlesByTagId(ids, error) {
return {
type: types.FETCH_ARTICLES_BY_TAG_ID_FAILURE,
id: _lodash2.default.get(ids, 0),
error: error,
failedAt: Date.now()
};
}
function receiveArticlesByTagId(response, ids) {
return {
type: types.FETCH_ARTICLES_BY_TAG_ID_SUCCESS,
id: _lodash2.default.get(ids, 0),
response: response,
receivedAt: Date.now()
};
}
function requestArticlesByCatId(ids) {
return {
type: types.FETCH_ARTICLES_BY_CAT_ID_REQUEST,
id: _lodash2.default.get(ids, 0)
};
}
function failToReceiveArticlesByCatId(ids, error) {
return {
type: types.FETCH_ARTICLES_BY_CAT_ID_FAILURE,
id: _lodash2.default.get(ids, 0),
error: error,
failedAt: Date.now()
};
}
function receiveArticlesByCatId(response, ids) {
return {
type: types.FETCH_ARTICLES_BY_CAT_ID_SUCCESS,
id: _lodash2.default.get(ids, 0),
response: response,
receivedAt: Date.now()
};
}
function requestArticlesByTopicId(ids) {
return {
type: types.FETCH_ARTICLES_BY_TOPIC_ID_REQUEST,
id: _lodash2.default.get(ids, 0)
};
}
function failToReceiveArticlesByTopicId(ids, error) {
return {
type: types.FETCH_ARTICLES_BY_TOPIC_ID_FAILURE,
id: _lodash2.default.get(ids, 0),
error: error,
failedAt: Date.now()
};
}
function receiveArticlesByTopicId(response, ids) {
return {
type: types.FETCH_ARTICLES_BY_TOPIC_ID_SUCCESS,
id: _lodash2.default.get(ids, 0),
response: response,
receivedAt: Date.now()
};
}
function requestArticlesByIds(ids) {
return {
type: types.FETCH_ARTICLES_REQUEST,
ids: ids
};
}
function failToReceiveArticlesByIds(ids, error) {
return {
type: types.FETCH_ARTICLES_FAILURE,
ids: ids,
error: error,
failedAt: Date.now()
};
}
function receiveArticlesByIds(response, ids) {
return {
type: types.FETCH_ARTICLES_SUCCESS,
ids: ids,
response: response,
receivedAt: Date.now()
};
}
function _buildQuery() {
var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var query = {};
var whitelist = ['where', 'embedded', 'max_results', 'page', 'sort'];
_lodash2.default.forEach(whitelist, function (ele) {
if (params.hasOwnProperty(ele)) {
if (ele === 'where' || ele === 'embedded') {
query[ele] = JSON.stringify(params[ele]);
} else {
query[ele] = params[ele];
}
}
});
query = _qs2.default.stringify(query);
return query;
}
function _buildPostQueryUrl() {
var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var query = _buildQuery(params);
return (0, _index2.formatUrl)('posts?' + query);
}
function _buildMetaQueryUrl() {
var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var query = _buildQuery(params);
return (0, _index2.formatUrl)('meta?' + query);
}
function _buildUrl() {
var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var target = arguments[1];
params = params || {};
params.sort = params.sort || '-publishedDate';
if (target === 'meta') {
return _buildMetaQueryUrl(params);
}
return _buildPostQueryUrl(params);
}
function _setupWhereParam(key, value) {
var params = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
params = params || {};
value = Array.isArray(value) ? value : [value];
var where = {};
if (value.length > 0) {
_lodash2.default.merge(where, params.where, _defineProperty({}, key, {
'$in': value
}));
}
params.where = where;
return params;
}
function _fetchArticles(url) {
return (0, _isomorphicFetch2.default)(url).then(function (response) {
var status = response.status;
if (status === 404) {
throw new _customError.NotFoundError('Resource are not found by url: ', url);
} else if (status >= 400) {
throw new _customError.InternalServerError('Bad response from API, response: ' + JSON.stringify(response));
}
return response.json();
});
}
function _fetchArticlesAndDispatchActions() {
var ids = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
var requestAction = arguments[3];
var successAction = arguments[4];
var failAction = arguments[5];
return function (dispatch) {
dispatch(requestAction(ids));
return _fetchArticles(_buildUrl(params, isOnlyMeta ? 'meta' : 'article')).then(function (response) {
var camelizedJson = (0, _humps.camelizeKeys)(response);
var normalized = (0, _normalizr.normalize)(camelizedJson.items, (0, _normalizr.arrayOf)(_index.article));
_lodash2.default.merge(normalized, { links: camelizedJson.links, meta: camelizedJson.meta });
return dispatch(successAction(normalized, ids));
}, function (error) {
return dispatch(failAction(ids, error));
});
};
}
function _dedupArticleIds() {
var ids = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
var state = arguments[1];
var isOnlyMeta = arguments[2];
var articles = _lodash2.default.get(state, ['entities', 'articles'], {});
var idsToFetch = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = ids[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var id = _step.value;
if (isOnlyMeta) {
if (!articles.hasOwnProperty(id)) {
idsToFetch.push(id);
}
} else {
// use content of article to determine if the article is fully fetched or not
if (!_lodash2.default.get(articles, [id, 'content'])) {
idsToFetch.push(id);
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return idsToFetch;
}
function _getListId() {
var target = arguments.length <= 0 || arguments[0] === undefined ? 'category' : arguments[0];
if (__DEVELOPMENT__) {
// eslint-disable-line
return target === 'category' ? _listId.devCatListId : _listId.devTopicListId;
}
return target === 'category' ? _listId.prodCatListId : _listId.prodTopicListId;
}
/* Fetch meta of articles by their ids if those are not existed in the state
* properties of meta: subtitle, name, heroImage, title, topics, publishedDate, slug, links, created and id
* @param {string[]} ids - article ids to fetch
* @param {object} params - params for composing query param of api
* @param {string} [params.sort=-publishedDate] -the way returned articles are sorted by
* @param {object} params.where - where query param
* @param {object} params.embedded - embedded query param
* @param {boolean} isOnlyMeta - if true, only get metadata of articles. Otherwise, get full articles.
*/
function fetchArticlesByIdsIfNeeded() {
var ids = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
return function (dispatch, getState) {
var idsToFetch = _dedupArticleIds(ids, getState(), isOnlyMeta);
if (idsToFetch.length === 0) {
return Promise.resolve();
}
params = _setupWhereParam('_id', idsToFetch, params);
if (!isOnlyMeta) {
// add default embedded
params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)();
}
return dispatch(_fetchArticlesAndDispatchActions(idsToFetch, params, isOnlyMeta, requestArticlesByIds, receiveArticlesByIds, failToReceiveArticlesByIds));
};
}
function fetchArticlesByTopicIdIfNeeded() {
var topicId = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
return function (dispatch, getState) {
if (!topicId || _lodash2.default.get(getState(), ['articlesByTopics', topicId])) {
return Promise.resolve();
}
params = _setupWhereParam('topics', [topicId], params);
if (!isOnlyMeta) {
// add default embedded
params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)();
}
return dispatch(_fetchArticlesAndDispatchActions([topicId], params, isOnlyMeta, requestArticlesByTopicId, receiveArticlesByTopicId, failToReceiveArticlesByTopicId));
};
}
function fetchArticlesByTagIdIfNeeded() {
var tagId = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
return function (dispatch, getState) {
var items = _lodash2.default.get(getState(), ['articleByTags', tagId, 'items'], []);
if (!tagId || items.length >= params.max_results * params.page) {
return Promise.resolve();
}
params = _setupWhereParam('tags', [tagId], params);
if (!isOnlyMeta) {
// add default embedded
params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)();
}
return dispatch(_fetchArticlesAndDispatchActions([tagId], params, isOnlyMeta, requestArticlesByTagId, receiveArticlesByTagId, failToReceiveArticlesByTagId));
};
}
function fetchArticlesByCatIdIfNeeded() {
var catId = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
return function (dispatch, getState) {
var items = _lodash2.default.get(getState(), ['articleByCats', catId, 'items'], []);
if (!catId || items.length >= params.max_results * params.page) {
return Promise.resolve();
}
params = _setupWhereParam('categories', [catId], params);
if (!isOnlyMeta) {
// add default embedded
params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)();
}
return dispatch(_fetchArticlesAndDispatchActions([catId], params, isOnlyMeta, requestArticlesByCatId, receiveArticlesByCatId, failToReceiveArticlesByCatId));
};
}
function fetchArticlesByTopicIdNameIfNeeded() {
var topicName = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
var listId = _getListId('topic');
var topicId = listId[topicName];
return fetchArticlesByTopicIdIfNeeded(topicId, params, isOnlyMeta);
}
function _fetchArticlesByName() {
var name = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
var target = arguments[3];
var listId = _getListId(target);
var id = listId[name];
params = params || {};
params.max_results = params.max_results || 10;
params.page = params.page || 1;
return target === 'category' ? fetchArticlesByCatIdIfNeeded(id, params, isOnlyMeta) : fetchArticlesByTagIdIfNeeded(id, params, isOnlyMeta);
}
function fetchArticlesByCatNameIfNeeded() {
var catName = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
return _fetchArticlesByName(catName, params, isOnlyMeta, 'category');
}
function fetchArticlesByTagNameIfNeeded() {
var tagName = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
return _fetchArticlesByName(tagName, params, isOnlyMeta, 'tag');
}