mirror of
https://gitlab.com/wheres-the-tp/ui-mobile.git
synced 2026-01-25 09:54:55 -06:00
77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
//@flow
|
|
import { ReplaySubject, Observable } from 'rxjs';
|
|
import FoodItemRecord, { createFoodItem } from '../records/FoodItemRecord';
|
|
import { setById } from '../helpers/ImmutableHelpers';
|
|
import { Map } from 'immutable';
|
|
import location$ from './LocationStream';
|
|
import { getFoodItems, type FoodItemsForLocation } from '../apis/FoodItemsApi';
|
|
import Filter$ from './FilterStream';
|
|
import Quantity$ from './QuantityStream';
|
|
import type { QuantityFragment } from '../constants/QuantityConstants';
|
|
import { type ImageFragment } from '../records/ImageRecord';
|
|
import Image$ from './ImagesStream';
|
|
|
|
const foodItemSubject: ReplaySubject<FoodItemRecord> = new ReplaySubject();
|
|
|
|
export function emitter(val?: ?FoodItemRecord) {
|
|
foodItemSubject.next(val);
|
|
}
|
|
|
|
emitter(null);
|
|
|
|
const manualUpdate$ = foodItemSubject.scan(
|
|
(foodItemMap: Map<string, FoodItemRecord>, foodItem: FoodItemRecord) => {
|
|
return foodItem ? foodItemMap.set(foodItem.id, foodItem) : foodItemMap;
|
|
},
|
|
Map()
|
|
);
|
|
|
|
const fetchedFoodItems$ = Filter$.combineLatest(location$)
|
|
.debounceTime(200)
|
|
.mergeMap(([filter, loc]) => {
|
|
if (!loc) {
|
|
return Promise.resolve({});
|
|
}
|
|
return Observable.merge(Promise.resolve({}), getFoodItems({ filter, loc }));
|
|
})
|
|
.map(({ fooditems }: FoodItemsForLocation) => {
|
|
if (fooditems) {
|
|
return fooditems.map(createFoodItem).reduce(setById, new Map());
|
|
}
|
|
return null;
|
|
});
|
|
|
|
export default fetchedFoodItems$
|
|
.combineLatest(manualUpdate$, (foodItemMap: Map<string, FoodItemRecord>, manualUpdates) => {
|
|
if (foodItemMap) {
|
|
return foodItemMap.mergeDeep(manualUpdates);
|
|
}
|
|
})
|
|
.combineLatest(
|
|
Quantity$,
|
|
(
|
|
foodItems: ?Map<string, FoodItemRecord>,
|
|
quantitiesFromStream: Map<string, QuantityFragment>
|
|
) => {
|
|
if (foodItems) {
|
|
return foodItems.mergeDeepWith(
|
|
(foodItem, foodItemQuantities) => foodItem.merge(foodItemQuantities),
|
|
quantitiesFromStream
|
|
);
|
|
}
|
|
}
|
|
)
|
|
.combineLatest(
|
|
Image$,
|
|
(foodItems: ?Map<string, FoodItemRecord>, latestFromImages$: Map<string, ImageFragment>) => {
|
|
if (foodItems) {
|
|
return foodItems.mergeDeepWith(
|
|
// $FlowFixMe
|
|
(foodItem: FoodItemRecord, imageFragment: ImageFragment) => {
|
|
return foodItem.set('images', imageFragment.images);
|
|
},
|
|
latestFromImages$
|
|
);
|
|
}
|
|
}
|
|
);
|