@randy.tarampi/jsx
Version:
Some common JSX components for www.randytarampi.ca
107 lines (92 loc) • 6.32 kB
JavaScript
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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; }
import { castDatePropertyToDateTime, filterPostsForBoundingBox, Gallery, Photo, Post, sortPostsByDate } from "@randy.tarampi/js";
import { fromJS, Map, Set } from "immutable";
import { REHYDRATE } from "redux-persist/constants";
import { createSelector } from "reselect";
import { FETCHING_POSTS_SUCCESS } from "../actions/posts/fetchPosts";
var postSearchTypes = ["blog", "map"];
var postSearchMetadata = ["oldest", "newest", "oldestFetched", "newestFetched"];
var initialState = Map(_objectSpread({
posts: Map()
}, postSearchMetadata.reduce((metadata, metadatum) => {
metadata[metadatum] = fromJS(postSearchTypes.reduce((metadatum, searchType) => {
metadatum[searchType] = {};
return metadatum;
}, {}));
return metadata;
}, {})));
export var postsReducer = function postsReducer() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments.length > 1 ? arguments[1] : undefined;
switch (action.type) {
case REHYDRATE:
{
if (action.payload.posts) {
var updatedState = state;
var loadedPosts = state.get("posts");
if (loadedPosts instanceof Set) {
updatedState = updatedState.set("posts", loadedPosts.reduce((mappedPosts, post) => mappedPosts.set(post.uid, post), Map()));
}
postSearchTypes.forEach(searchType => {
postSearchMetadata.forEach(searchMetadata => {
if (updatedState.hasIn([searchMetadata, searchType])) {
updatedState = state.setIn([searchMetadata, searchType], buildOldestOrNewestPostMeta(action.payload.posts.toJS(), searchMetadata));
}
});
});
return updatedState;
}
return state;
}
case FETCHING_POSTS_SUCCESS:
{
if (action.payload.posts) {
var _updatedState = state;
action.payload.posts.forEach(post => {
_updatedState = _updatedState.setIn(["posts", post.uid], post);
});
if (action.payload.searchParams.tags) {
return _updatedState;
}
postSearchMetadata.forEach(searchMetadata => {
if (_updatedState.hasIn([searchMetadata, action.payload.searchType])) {
_updatedState = _updatedState.setIn([searchMetadata, action.payload.searchType], buildOldestOrNewestPostMeta(action.payload, searchMetadata));
}
});
return _updatedState;
}
return state;
}
default:
return state;
}
};
var buildOldestOrNewestPostMeta = (payload, key) => payload[key] ? Map(Object.keys(payload[key]).reduce((keyest, keyestKey) => {
keyest[keyestKey] = castDatePropertyToDateTime(payload[key][keyestKey]);
return keyest;
}, {})) : Map();
export default postsReducer;
export var getPosts = state => state.get("posts").toList();
export var createFilteredPostsSelector = function createFilteredPostsSelector() {
for (var _len = arguments.length, filterOrSelectors = new Array(_len), _key = 0; _key < _len; _key++) {
filterOrSelectors[_key] = arguments[_key];
}
return filterOrSelectors.length > 1 ? createSelector(...filterOrSelectors) : createSelector(getPosts, ...filterOrSelectors);
};
export var getPostsForBoundingBox = (state, north, east, south, west) => filterPostsForBoundingBox(getPosts(state), north, east, south, west);
export var getPhotoPosts = createFilteredPostsSelector(posts => posts.filter(post => post instanceof Photo || post instanceof Gallery));
export var getWordPosts = createFilteredPostsSelector(posts => posts.filter(post => post instanceof Post));
export var getPostsSortedByDate = createFilteredPostsSelector(posts => posts.sort(sortPostsByDate));
export var getPhotoPostsSortedByDate = createFilteredPostsSelector(getPhotoPosts, posts => posts.sort(sortPostsByDate));
export var getWordPostsSortedByDate = createFilteredPostsSelector(getWordPosts, posts => posts.sort(sortPostsByDate));
export var getPostsSortedByDateForBoundingBox = createFilteredPostsSelector(getPostsForBoundingBox, posts => posts.sort(sortPostsByDate));
export var getOldestPost = createFilteredPostsSelector(getPostsSortedByDate, sortedPosts => sortedPosts.last());
export var getNewestPost = createFilteredPostsSelector(getPostsSortedByDate, sortedPosts => sortedPosts.first());
export var getOldestPostForBoundingBox = createFilteredPostsSelector(getPostsSortedByDateForBoundingBox, sortedPosts => sortedPosts.last());
export var getNewestPostForBoundingBox = createFilteredPostsSelector(getPostsSortedByDateForBoundingBox, sortedPosts => sortedPosts.first());
export var getOldestAvailablePostDateForSearchTypeAndPostType = (state, searchType, postType) => state.getIn(["oldest", searchType, postType]);
export var getNewestAvailablePostDateForSearchTypeAndPostType = (state, searchType, postType) => state.getIn(["newest", searchType, postType]);
export var getOldestFetchedPostDateForSearchTypeAndPostType = (state, searchType, postType) => state.getIn(["oldestFetched", searchType, postType]);
export var getNewestFetchedPostDateForSearchTypeAndPostType = (state, searchType, postType) => state.getIn(["newestFetched", searchType, postType]);