UNPKG

@randy.tarampi/jsx

Version:

Some common JSX components for www.randytarampi.ca

110 lines (98 loc) 4.33 kB
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;