Skip to content

Commit 79b9044

Browse files
committed
move filters into FancyMenu's state
1 parent ae82b05 commit 79b9044

File tree

1 file changed

+50
-71
lines changed

1 file changed

+50
-71
lines changed

source/views/menus/components/fancy-menu.js

Lines changed: 50 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
import * as React from 'react'
44
import {StyleSheet, SectionList} from 'react-native'
55
import * as c from '../../components/colors'
6-
import {connect} from 'react-redux'
7-
import {updateMenuFilters, type ReduxState} from '../../../flux'
86
import {type TopLevelViewPropsType} from '../../types'
97
import type momentT from 'moment'
108
import type {
11-
MenuItemType,
9+
MenuItemType as MenuItem,
1210
MasterCorIconMapType,
1311
ProcessedMealType,
1412
MenuItemContainerType,
@@ -35,19 +33,17 @@ type ReactProps = TopLevelViewPropsType & {
3533
refreshing?: ?boolean,
3634
}
3735

38-
type ReduxDispatchProps = {
39-
onFiltersChange: (f: FilterType[]) => any,
40-
}
41-
42-
type ReduxStateProps = {
43-
filters: FilterType[],
44-
}
36+
type FilterFunc = (filters: Array<FilterType>, item: MenuItem) => boolean
4537

4638
type DefaultProps = {
47-
applyFilters: (filters: FilterType[], item: MenuItemType) => boolean,
39+
applyFilters: FilterFunc,
4840
}
4941

50-
type Props = ReactProps & ReduxStateProps & ReduxDispatchProps & DefaultProps
42+
type Props = ReactProps & DefaultProps
43+
44+
type State = {
45+
filters: Array<FilterType>,
46+
};
5147

5248
const styles = StyleSheet.create({
5349
inner: {
@@ -61,51 +57,51 @@ const styles = StyleSheet.create({
6157
const LEFT_MARGIN = 28
6258
const Separator = () => <ListSeparator spacing={{left: LEFT_MARGIN}} />
6359

64-
class FancyMenu extends React.PureComponent<Props> {
60+
export class FancyMenu extends React.Component<Props, State> {
6561
static defaultProps = {
6662
applyFilters: applyFiltersToItem,
6763
}
6864

69-
componentDidMount() {
70-
const {foodItems, menuCorIcons, meals, now, onFiltersChange} = this.props
71-
const newFilters = buildFilters(values(foodItems), menuCorIcons, meals, now)
72-
onFiltersChange(newFilters)
65+
state = {
66+
filters: [],
7367
}
7468

75-
componentDidUpdate() {
76-
if (this.props.filters.length) {
77-
return null
78-
}
79-
80-
const {foodItems, menuCorIcons, meals, now, onFiltersChange} = this.props
81-
const newFilters = buildFilters(values(foodItems), menuCorIcons, meals, now)
82-
onFiltersChange(newFilters)
69+
static getDerivedStateFromProps(props: Props) {
70+
let {foodItems, menuCorIcons, meals, now} = props
71+
let filters = buildFilters(values(foodItems), menuCorIcons, meals, now)
72+
return {filters}
8373
}
8474

85-
areSpecialsFiltered = filters => Boolean(filters.find(this.isSpecialsFilter))
86-
isSpecialsFilter = f =>
75+
areSpecialsFiltered = (filters: Array<FilterType>) =>
76+
Boolean(filters.find(this.isSpecialsFilter))
77+
isSpecialsFilter = (f: FilterType) =>
8778
f.enabled && f.type === 'toggle' && f.spec.label === 'Only Show Specials'
8879

8980
openFilterView = () => {
9081
this.props.navigation.navigate('FilterView', {
9182
title: `Filter ${this.props.name} Menu`,
92-
pathToFilters: ['menus', this.props.name],
93-
onChange: filters => this.props.onFiltersChange(filters),
83+
initialFilters: this.state.filters,
84+
onDismiss: filters => this.setState(() => ({filters})),
9485
})
9586
}
9687

97-
groupMenuData = (props: Props, stations: Array<StationMenuType>) => {
98-
const {applyFilters, filters, foodItems} = props
88+
groupMenuData = (args: {
89+
filters: Array<FilterType>,
90+
stations: Array<StationMenuType>,
91+
foodItems: MenuItemContainerType,
92+
applyFilters: FilterFunc,
93+
}) => {
94+
let {applyFilters, foodItems, stations, filters} = args
9995

100-
const derefrenceMenuItems = menu =>
96+
let derefrenceMenuItems = menu =>
10197
menu.items
10298
// Dereference each menu item
10399
.map(id => foodItems[id])
104100
// Ensure that the referenced menu items exist,
105101
// and apply the selected filters to the items in the menu
106102
.filter(item => item && applyFilters(filters, item))
107103

108-
const menusWithItems = stations
104+
let menusWithItems = stations
109105
// We're grouping the menu items in a [label, Array<items>] tuple.
110106
.map(menu => [menu.label, derefrenceMenuItems(menu)])
111107
// We only want to show stations with at least one item in them
@@ -117,9 +113,10 @@ class FancyMenu extends React.PureComponent<Props> {
117113
}
118114

119115
renderSectionHeader = ({section: {title}}: any) => {
120-
const {filters, now, meals} = this.props
121-
const {stations} = chooseMeal(meals, filters, now)
122-
const menu = stations.find(m => m.label === title)
116+
let {now, meals} = this.props
117+
let {filters} = this.state
118+
let {stations} = chooseMeal(meals, filters, now)
119+
let menu = stations.find(m => m.label === title)
123120

124121
return (
125122
<ListSectionHeader
@@ -130,8 +127,8 @@ class FancyMenu extends React.PureComponent<Props> {
130127
)
131128
}
132129

133-
renderItem = ({item}: {item: MenuItemType}) => {
134-
const specialsFilterEnabled = this.areSpecialsFiltered(this.props.filters)
130+
renderItem = ({item}: {item: MenuItem}) => {
131+
let specialsFilterEnabled = this.areSpecialsFiltered(this.state.filters)
135132
return (
136133
<FoodItemRow
137134
badgeSpecials={!specialsFilterEnabled}
@@ -142,15 +139,21 @@ class FancyMenu extends React.PureComponent<Props> {
142139
)
143140
}
144141

145-
keyExtractor = (item, index) => index.toString()
142+
keyExtractor = (item: MenuItem, index: number) => index.toString()
146143

147144
render() {
148-
const {filters, now, meals, cafeMessage} = this.props
149-
150-
const {label: mealName, stations} = chooseMeal(meals, filters, now)
151-
const anyFiltersEnabled = filters.some(f => f.enabled)
152-
const specialsFilterEnabled = this.areSpecialsFiltered(filters)
153-
const groupedMenuData = this.groupMenuData(this.props, stations)
145+
let {now, meals, cafeMessage, applyFilters, foodItems} = this.props
146+
let {filters} = this.state
147+
148+
let {label: mealName, stations} = chooseMeal(meals, filters, now)
149+
let anyFiltersEnabled = filters.some(f => f.enabled)
150+
let specialsFilterEnabled = this.areSpecialsFiltered(filters)
151+
let groupedMenuData = this.groupMenuData({
152+
stations,
153+
filters,
154+
applyFilters,
155+
foodItems,
156+
})
154157

155158
let message = 'No items to show.'
156159
if (cafeMessage) {
@@ -162,9 +165,9 @@ class FancyMenu extends React.PureComponent<Props> {
162165
message = 'No items to show. Try changing the filters.'
163166
}
164167

165-
const messageView = <NoticeView style={styles.message} text={message} />
168+
let messageView = <NoticeView style={styles.message} text={message} />
166169

167-
const header = (
170+
let header = (
168171
<FilterToolbar
169172
date={now}
170173
filters={filters}
@@ -190,27 +193,3 @@ class FancyMenu extends React.PureComponent<Props> {
190193
)
191194
}
192195
}
193-
194-
const mapState = (
195-
state: ReduxState,
196-
actualProps: ReactProps,
197-
): ReduxStateProps => {
198-
if (!state.menus) {
199-
return {filters: []}
200-
}
201-
return {
202-
filters: state.menus[actualProps.name] || [],
203-
}
204-
}
205-
206-
const mapDispatch = (dispatch, actualProps: ReactProps): ReduxDispatchProps => {
207-
return {
208-
onFiltersChange: (filters: FilterType[]) =>
209-
dispatch(updateMenuFilters(actualProps.name, filters)),
210-
}
211-
}
212-
213-
export const ConnectedFancyMenu = connect(
214-
mapState,
215-
mapDispatch,
216-
)(FancyMenu)

0 commit comments

Comments
 (0)