33import * as React from 'react'
44import { StyleSheet , SectionList } from 'react-native'
55import * as c from '../../components/colors'
6- import { connect } from 'react-redux'
7- import { updateMenuFilters , type ReduxState } from '../../../flux'
86import { type TopLevelViewPropsType } from '../../types'
97import type momentT from 'moment'
108import 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
4638type 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
5248const styles = StyleSheet . create ( {
5349 inner : {
@@ -61,51 +57,51 @@ const styles = StyleSheet.create({
6157const LEFT_MARGIN = 28
6258const 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