2020-04-13 22:11:20 -05:00
|
|
|
import withProps from 'recompose/withProps';
|
|
|
|
|
import mapPropsStream from 'recompose/mapPropsStream';
|
|
|
|
|
import compose from 'recompose/compose';
|
|
|
|
|
import Places$, { emitter as emitPlace } from '../streams/PlacesStream';
|
2020-04-17 22:50:23 -05:00
|
|
|
import Products$ from '../streams/ProductsStream';
|
2020-04-13 22:11:20 -05:00
|
|
|
import { path } from 'ramda';
|
2020-04-17 22:50:23 -05:00
|
|
|
import { List, getIn } from 'immutable';
|
2020-04-13 22:11:20 -05:00
|
|
|
import { buildPlaceRecord } from '../records/PlaceRecord';
|
|
|
|
|
import { getPlaceDetails } from '../apis/GooglePlacesApi';
|
|
|
|
|
import { getSearch } from '../helpers/RouteHelpers';
|
|
|
|
|
import { withRouterContext } from './routeEnhancers';
|
2018-08-12 09:51:44 -05:00
|
|
|
|
2020-04-17 22:50:23 -05:00
|
|
|
export const fetchPlaceDetails = async ({ distance, placeId }) => {
|
2018-08-12 09:51:44 -05:00
|
|
|
const place = await getPlaceDetails({
|
|
|
|
|
distance,
|
2020-04-13 22:11:20 -05:00
|
|
|
placeId,
|
2018-08-12 09:51:44 -05:00
|
|
|
});
|
|
|
|
|
emitPlace(buildPlaceRecord(place));
|
|
|
|
|
};
|
2017-04-15 15:11:22 -05:00
|
|
|
|
|
|
|
|
export const withPlaces = mapPropsStream(props$ =>
|
2017-04-26 22:06:31 -05:00
|
|
|
props$.combineLatest(Places$, (props, places) => {
|
|
|
|
|
return {
|
|
|
|
|
...props,
|
2020-04-13 22:11:20 -05:00
|
|
|
places,
|
2017-04-26 22:06:31 -05:00
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
);
|
2017-04-15 15:11:22 -05:00
|
|
|
|
|
|
|
|
export const withPlaceIdFromRoute = withProps((props: { match: { params: { id: string } } }) => {
|
2020-04-13 22:11:20 -05:00
|
|
|
const placeId = path(['match', 'params', 'id'], props);
|
2017-04-26 22:06:31 -05:00
|
|
|
return { placeId };
|
2017-04-15 15:11:22 -05:00
|
|
|
});
|
|
|
|
|
|
2018-08-19 11:00:17 -05:00
|
|
|
export const withPlaceId = compose(
|
|
|
|
|
withRouterContext,
|
2017-07-02 17:55:00 -05:00
|
|
|
withProps(props => {
|
2018-08-19 11:00:17 -05:00
|
|
|
const placeId = props.placeId || getSearch(props).placeId;
|
|
|
|
|
return { placeId };
|
2017-07-02 17:55:00 -05:00
|
|
|
})
|
|
|
|
|
);
|
2017-04-26 22:06:31 -05:00
|
|
|
|
2018-08-19 11:00:17 -05:00
|
|
|
export const withPlaceActions = withProps(() => {
|
|
|
|
|
return {
|
|
|
|
|
emitPlace,
|
2020-04-13 22:11:20 -05:00
|
|
|
fetchPlaceDetails,
|
2018-08-19 11:00:17 -05:00
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const withPlace = compose(
|
|
|
|
|
withPlaceId,
|
2018-08-12 11:34:45 -05:00
|
|
|
withPlaces,
|
2020-04-17 22:50:23 -05:00
|
|
|
withProps(({ placeId, places, placeType }) => {
|
|
|
|
|
const place =
|
|
|
|
|
placeId && placeType && getIn(places, [placeType], []).find(place => place.id === placeId);
|
|
|
|
|
|
|
|
|
|
return { place, fetchPlaceDetails };
|
2018-08-12 11:34:45 -05:00
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
|
2020-04-17 22:50:23 -05:00
|
|
|
export const withPlaceForProduct = compose(
|
2018-08-19 11:00:17 -05:00
|
|
|
withPlaces,
|
2020-04-17 22:50:23 -05:00
|
|
|
withProps(({ places, product }) => {
|
|
|
|
|
if (!product || !product.placeType) {
|
2018-08-19 11:00:17 -05:00
|
|
|
return { place: null };
|
|
|
|
|
}
|
2020-04-17 22:50:23 -05:00
|
|
|
const place = getIn(places, [product.placeType, 0]);
|
2020-04-13 22:11:20 -05:00
|
|
|
return { place };
|
2017-04-26 22:06:31 -05:00
|
|
|
})
|
|
|
|
|
);
|
2017-07-23 19:58:10 -05:00
|
|
|
|
2020-04-17 22:50:23 -05:00
|
|
|
export const withProductsForPlace = mapPropsStream(props$ =>
|
|
|
|
|
props$.combineLatest(Products$, (props, productsMap) => {
|
2017-07-23 19:58:10 -05:00
|
|
|
const placeId = props.placeId;
|
2020-04-17 22:50:23 -05:00
|
|
|
const products = productsMap
|
|
|
|
|
? productsMap.toList().filter(product => placeId === product.placeId)
|
2018-05-06 09:53:44 -05:00
|
|
|
: List();
|
2017-07-23 19:58:10 -05:00
|
|
|
return {
|
|
|
|
|
...props,
|
2020-04-17 22:50:23 -05:00
|
|
|
products,
|
2017-07-23 19:58:10 -05:00
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
);
|