@randy.tarampi/jsx
Version:
Some common JSX components for www.randytarampi.ca
110 lines (98 loc) • 4.33 kB
JavaScript
import _debounce from "lodash/debounce";
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 { Gallery, Photo, Post } from "@randy.tarampi/js";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { fetchPostsForMapCreator } from "../actions";
import { MappedPostsComponent } from "../components/mappedPosts";
import { createGetErrorForUrlSelector, createIsLoadingUrlSelector } from "../data";
import { createComplexPostsSelector, selectors } from "../data/selectors";
import { generateFilterFunctionForFilterName, generateTransformFunctionForTransformName } from "../util";
var getBasePostsSelectorForType = type => {
switch (type) {
case Photo.type:
case Gallery.type:
return selectors.getPhotoPosts;
case Post.type:
return selectors.getWordPosts;
default:
return selectors.getPosts;
}
};
export var MAPPED_POSTS_FETCH_DEBOUNCE_DELAY = 500;
export var MAPPED_POSTS_FETCHING_POSTS_PER_PAGE = 32;
export var connectMappedPosts = connect((state, ownProps) => {
var isLoadingUrlSelector = createIsLoadingUrlSelector();
var errorForUrlSelector = createGetErrorForUrlSelector();
var {
type = "global",
fetchUrl
} = ownProps;
var {
filter,
filterValue
} = ownProps.match && ownProps.match.params || ownProps;
var mapState = selectors.getMap(state, ownProps.id);
var {
center,
heading,
type: mapType,
tilt,
zoom,
bounds
} = mapState ? mapState.toJS() : {};
var props = {
isLoading: isLoadingUrlSelector(state, fetchUrl),
error: errorForUrlSelector(state, fetchUrl),
defaultCenter: center,
defaultHeading: heading,
defaultMapTypeId: mapType,
defaultTilt: tilt,
defaultZoom: zoom,
currentBounds: bounds,
currentCenter: center,
currentHeading: heading,
currentTilt: tilt,
currentZoom: zoom
};
var postsFilters = [generateFilterFunctionForFilterName.location()];
if (filter) {
postsFilters.push(generateFilterFunctionForFilterName[filter](filterValue));
}
if (bounds) {
postsFilters.push(generateFilterFunctionForFilterName.boundingBox(bounds.north, bounds.east, bounds.south, bounds.west));
}
postsFilters.push(generateTransformFunctionForTransformName.location(undefined, 0.0004));
var postsSelector = createComplexPostsSelector(postsFilters, [getBasePostsSelectorForType(type)]);
props.posts = postsSelector(state);
return props;
}, (dispatch, _ref) => {
var {
fetchUrl,
type,
match,
fetchPostsParams,
id
} = _ref;
return {
fetchPosts: _debounce(passedParams => {
var searchParams = _objectSpread(_objectSpread(_objectSpread({}, match && match.params), fetchPostsParams), {}, {
perPage: MAPPED_POSTS_FETCHING_POSTS_PER_PAGE
}, passedParams);
return dispatch(fetchPostsForMapCreator(id, fetchUrl, type, searchParams));
}, MAPPED_POSTS_FETCH_DEBOUNCE_DELAY)
};
});
export var ConnectedMappedPosts = connectMappedPosts(MappedPostsComponent);
ConnectedMappedPosts.propTypes = {
id: PropTypes.string.isRequired,
fetchUrl: PropTypes.string.isRequired,
type: PropTypes.oneOf([Post.type, Photo.type])
};
ConnectedMappedPosts.defaultProps = {
id: "map-posts",
fetchUrl: "/posts"
};
export default ConnectedMappedPosts;