aretherecookies-mobile/js/components/FoodItemList.js
2018-08-25 10:12:52 -05:00

68 lines
1.9 KiB
JavaScript

// @flow
import React, { Component } from 'react';
import { View } from 'react-native';
import { type SetSeq } from 'immutable';
import FoodItemRecord from '../records/FoodItemRecord';
import { compose, pure } from 'recompose';
import { pipe } from 'ramda';
import { withFilter } from '../enhancers/filterEnhancers';
import FilterRecord from '../records/FilterRecord';
import { compareQuantity } from '../helpers/QuantityHelpers';
// promote this somewhere?
type homomorph<T> = T => T;
type Props = {
filter: FilterRecord,
foodItemsSeq: SetSeq<FoodItemRecord>,
children: (foodItem: FoodItemRecord) => Component<*, *, *>,
};
const sortByDistance = (foodItemsSeq: SetSeq<FoodItemRecord>): SetSeq<FoodItemRecord> => {
return foodItemsSeq.sort((left, right) => left.distance - right.distance);
};
const sortByLastUpdated = (foodItemsSeq: SetSeq<FoodItemRecord>): SetSeq<FoodItemRecord> => {
return foodItemsSeq.sort((left, right) => right.lastupdated - left.lastupdated);
};
const sortByQuantity = (foodItemsSeq: SetSeq<FoodItemRecord>): SetSeq<FoodItemRecord> => {
return foodItemsSeq.sort((left, right) => {
const quantityCompare = compareQuantity(left.quantity, right.quantity);
return quantityCompare === 0 ? left.distance - right.distance : quantityCompare;
});
};
const getSortBy = (filter: FilterRecord): homomorph<*> => {
switch (filter.orderby) {
case 'quantity':
return sortByQuantity;
case 'lastupdated':
return sortByLastUpdated;
default:
return sortByDistance;
}
};
const intoArray = (foodItemsSeq: SetSeq<FoodItemRecord>): Array<FoodItemRecord> =>
foodItemsSeq ? foodItemsSeq.toArray() : [];
const FoodItemList = (props: Props) => {
const { filter, foodItemsSeq, children } = props;
if (!foodItemsSeq) {
return null;
}
const items = pipe(
getSortBy(filter),
intoArray
)(foodItemsSeq);
return <View style={{ flexShrink: 2 }}>{items.map(children)}</View>;
};
export default compose(
pure,
withFilter
)(FoodItemList);