mirror of
https://gitlab.com/wheres-the-tp/ui-mobile.git
synced 2026-01-25 10:04:56 -06:00
68 lines
1.9 KiB
JavaScript
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);
|