aretherecookies-mobile/js/enhancers/placeEnhancers.js
2020-04-17 22:50:23 -05:00

83 lines
2.1 KiB
JavaScript

import withProps from 'recompose/withProps';
import mapPropsStream from 'recompose/mapPropsStream';
import compose from 'recompose/compose';
import Places$, { emitter as emitPlace } from '../streams/PlacesStream';
import Products$ from '../streams/ProductsStream';
import { path } from 'ramda';
import { List, getIn } from 'immutable';
import { buildPlaceRecord } from '../records/PlaceRecord';
import { getPlaceDetails } from '../apis/GooglePlacesApi';
import { getSearch } from '../helpers/RouteHelpers';
import { withRouterContext } from './routeEnhancers';
export const fetchPlaceDetails = async ({ distance, placeId }) => {
const place = await getPlaceDetails({
distance,
placeId,
});
emitPlace(buildPlaceRecord(place));
};
export const withPlaces = mapPropsStream(props$ =>
props$.combineLatest(Places$, (props, places) => {
return {
...props,
places,
};
})
);
export const withPlaceIdFromRoute = withProps((props: { match: { params: { id: string } } }) => {
const placeId = path(['match', 'params', 'id'], props);
return { placeId };
});
export const withPlaceId = compose(
withRouterContext,
withProps(props => {
const placeId = props.placeId || getSearch(props).placeId;
return { placeId };
})
);
export const withPlaceActions = withProps(() => {
return {
emitPlace,
fetchPlaceDetails,
};
});
export const withPlace = compose(
withPlaceId,
withPlaces,
withProps(({ placeId, places, placeType }) => {
const place =
placeId && placeType && getIn(places, [placeType], []).find(place => place.id === placeId);
return { place, fetchPlaceDetails };
})
);
export const withPlaceForProduct = compose(
withPlaces,
withProps(({ places, product }) => {
if (!product || !product.placeType) {
return { place: null };
}
const place = getIn(places, [product.placeType, 0]);
return { place };
})
);
export const withProductsForPlace = mapPropsStream(props$ =>
props$.combineLatest(Products$, (props, productsMap) => {
const placeId = props.placeId;
const products = productsMap
? productsMap.toList().filter(product => placeId === product.placeId)
: List();
return {
...props,
products,
};
})
);