aretherecookies-mobile/js/enhancers/createProductEnhancers.js

88 lines
2.2 KiB
JavaScript
Raw Normal View History

import mapPropsStream from 'recompose/mapPropsStream';
2020-04-17 22:50:23 -05:00
import CreateProduct$, { emitter as emitCreateItemState } from '../streams/CreateProductStream';
import { emitter as emitProductsState } from '../streams/ProductsStream';
import { createProduct } from '../apis/ProductsApi';
import ProductRecord, { createProduct as buildProduct } from '../records/ProductRecord';
2018-11-24 10:43:26 -06:00
import Snackbar from 'react-native-snackbar';
2020-04-17 22:50:23 -05:00
export const withCreateProductState = mapPropsStream(props$ => {
return props$.combineLatest(CreateProduct$, (props, state) => {
const { product, loading, error } = state;
2020-04-17 22:50:23 -05:00
const setProduct = (product: ProductRecord) => emitCreateItemState({ ...state, product });
const setLoading = (loading: boolean) => emitCreateItemState({ ...state, loading });
const setError = (error: Error) => emitCreateItemState({ ...state, error });
2020-04-17 22:50:23 -05:00
const saveProduct = async () => {
2018-12-15 12:40:03 -06:00
try {
2020-04-17 22:50:23 -05:00
// insert new item into db and cast it into ProductRecord
const newItem = buildProduct(await createProduct(product));
2018-03-04 09:02:21 -06:00
Snackbar.show({
2020-04-17 22:50:23 -05:00
title: product.name + ' added',
backgroundColor: 'black',
color: 'white',
});
2018-11-24 10:43:26 -06:00
2018-03-04 09:02:21 -06:00
// notify food items state of new item
2020-04-17 22:50:23 -05:00
emitProductsState(newItem);
2018-03-04 09:02:21 -06:00
// clear the create item form to default empty record
2020-04-17 22:50:23 -05:00
setProduct(new ProductRecord());
2018-03-04 09:02:21 -06:00
// allow caller to see what was created
return newItem;
2018-12-15 12:40:03 -06:00
} catch (err) {
const error = formatError(err);
Snackbar.show({
title: error,
duration: Snackbar.LENGTH_LONG,
backgroundColor: 'black',
color: 'white',
});
2018-12-15 12:40:03 -06:00
throw error;
}
};
return {
...props,
2020-04-17 22:50:23 -05:00
product,
loading,
error,
2020-04-17 22:50:23 -05:00
setProduct,
saveProduct,
setLoading,
setError,
};
});
});
2018-12-15 12:40:03 -06:00
function getNameForKey(key) {
switch (key) {
case 'name':
return 'Name';
case 'placeId':
return 'Place';
case 'category':
return 'Category';
case 'quantity':
return 'Quantity';
case 'latitude':
case 'longitude':
default:
return '';
}
}
function formatError({ message } = {}) {
try {
const msgObj = JSON.parse(message);
if (msgObj.missingkeys) {
return `Please fill in ${msgObj.missingkeys.map(getNameForKey).join(', ')}`;
}
} catch (err) {} //eslint-disable-line
return message;
}