aretherecookies-mobile/js/streams/FoodItemsStream.js
2019-09-21 15:45:07 +00:00

74 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$
);
}
}
);