2017-08-27 14:29:37 -05:00
|
|
|
// @flow
|
2019-09-21 15:45:07 +00:00
|
|
|
import { memoizeWith, identity } from "ramda";
|
|
|
|
|
import FilterRecord from "../records/FilterRecord";
|
|
|
|
|
import FoodItemRecord from "../records/FoodItemRecord";
|
|
|
|
|
import AuthManager from "../AuthManager";
|
|
|
|
|
import { map, path, nth } from "ramda";
|
|
|
|
|
import { addImage } from "./ImagesApi";
|
|
|
|
|
import { fetchRequest } from "./FetchApi";
|
2017-10-29 20:18:33 -05:00
|
|
|
|
2017-10-22 12:38:05 -05:00
|
|
|
export type FoodItemsFilter = {
|
2019-09-21 15:45:07 +00:00
|
|
|
radius?: number
|
2017-10-22 12:38:05 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export type RawFoodItem = {
|
|
|
|
|
id: string,
|
|
|
|
|
name: string,
|
2018-04-08 10:54:29 -05:00
|
|
|
placeid: string,
|
2017-10-22 12:38:05 -05:00
|
|
|
category: string,
|
|
|
|
|
images: string,
|
|
|
|
|
thumbimage: string,
|
|
|
|
|
latitude: number,
|
|
|
|
|
longitude: number,
|
|
|
|
|
distance: number,
|
2019-09-21 15:45:07 +00:00
|
|
|
lastupdated: number
|
2017-10-22 12:38:05 -05:00
|
|
|
};
|
2017-08-27 14:29:37 -05:00
|
|
|
|
2017-10-22 12:38:05 -05:00
|
|
|
export type FoodItemsForLocation = {
|
|
|
|
|
orderby: string,
|
|
|
|
|
filter: FoodItemsFilter,
|
2019-09-21 15:45:07 +00:00
|
|
|
fooditems: ?Array<RawFoodItem>
|
2017-08-27 14:29:37 -05:00
|
|
|
};
|
2017-10-22 12:38:05 -05:00
|
|
|
|
2019-09-21 15:45:07 +00:00
|
|
|
export const getFoodItems = memoizeWith(
|
|
|
|
|
identity,
|
|
|
|
|
async ({ loc, filter }: { loc: Position, filter: FilterRecord }): Promise<FoodItemsForLocation> => {
|
2018-04-28 13:12:38 -05:00
|
|
|
const {
|
2019-09-21 15:45:07 +00:00
|
|
|
coords: { latitude: lat, longitude: lng }
|
2018-04-28 13:12:38 -05:00
|
|
|
} = loc;
|
2018-06-03 12:30:19 -05:00
|
|
|
const { orderby, categories, radius, search } = filter;
|
2017-11-11 20:15:19 -06:00
|
|
|
|
2018-02-04 13:14:37 -06:00
|
|
|
try {
|
2018-02-11 09:53:53 -06:00
|
|
|
return fetchRequest({
|
2019-09-21 15:45:07 +00:00
|
|
|
endpoint: "/fooditems",
|
|
|
|
|
method: "POST",
|
2018-02-11 09:53:53 -06:00
|
|
|
body: {
|
2018-02-04 13:14:37 -06:00
|
|
|
lat,
|
|
|
|
|
lng,
|
|
|
|
|
orderby,
|
|
|
|
|
filter: {
|
|
|
|
|
...(categories ? { categories } : {}),
|
|
|
|
|
radius,
|
2019-09-21 15:45:07 +00:00
|
|
|
search
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-02-11 09:53:53 -06:00
|
|
|
}).then(json => ({
|
|
|
|
|
...json,
|
|
|
|
|
loading: false,
|
2019-09-21 15:45:07 +00:00
|
|
|
error: null
|
2018-02-11 09:53:53 -06:00
|
|
|
}));
|
2018-02-04 13:14:37 -06:00
|
|
|
} catch (error) {
|
2019-09-21 15:45:07 +00:00
|
|
|
console.error(error); // eslint-disable-line no-console
|
2018-02-04 13:14:37 -06:00
|
|
|
return {
|
2019-09-21 15:45:07 +00:00
|
|
|
orderby: "distance",
|
2018-02-04 13:14:37 -06:00
|
|
|
filter: {},
|
|
|
|
|
fooditems: [],
|
2017-10-22 12:38:05 -05:00
|
|
|
loading: false,
|
2019-09-21 15:45:07 +00:00
|
|
|
error: error
|
2018-02-04 13:14:37 -06:00
|
|
|
};
|
|
|
|
|
}
|
2017-10-22 12:38:05 -05:00
|
|
|
}
|
2018-02-04 13:14:37 -06:00
|
|
|
);
|
|
|
|
|
|
2018-02-11 09:53:53 -06:00
|
|
|
export const createFoodItem = async (foodItem: FoodItemRecord) => {
|
2019-03-02 10:37:53 -06:00
|
|
|
if (!AuthManager.user) {
|
2019-09-21 15:45:07 +00:00
|
|
|
throw new Error("You must be logged in to create food items");
|
2019-03-02 10:37:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const username = AuthManager.user.name;
|
|
|
|
|
|
2018-02-11 09:53:53 -06:00
|
|
|
const res = await fetchRequest({
|
2019-09-21 15:45:07 +00:00
|
|
|
endpoint: "/addfooditem",
|
|
|
|
|
method: "POST",
|
|
|
|
|
body: foodItem
|
2018-02-04 13:14:37 -06:00
|
|
|
});
|
2018-02-25 12:25:24 -06:00
|
|
|
|
2018-04-08 10:54:29 -05:00
|
|
|
const addImageUri = (imageUri: string) => addImage({ foodItemId: res.id, imageUri, username });
|
|
|
|
|
|
2019-09-21 15:45:07 +00:00
|
|
|
const images = map(path(["url"]), await Promise.all(map(addImageUri, foodItem.images.toArray())));
|
2018-02-25 12:25:24 -06:00
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
...res,
|
|
|
|
|
images,
|
2019-09-21 15:45:07 +00:00
|
|
|
thumbimage: nth(0, images)
|
2018-02-25 12:25:24 -06:00
|
|
|
};
|
2018-02-04 13:14:37 -06:00
|
|
|
};
|