11// @flow
22
33import * as React from 'react'
4- import { StyleSheet , SectionList } from 'react-native'
4+ import { StyleSheet , SectionList , ActivityIndicator } from 'react-native'
55import type { TopLevelViewPropsType } from '../../types'
66import type { CourseType } from '../../../lib/course-search/types'
77import { ListSeparator , ListSectionHeader } from '../../components/list'
@@ -21,15 +21,23 @@ const styles = StyleSheet.create({
2121 message : {
2222 paddingVertical : 16 ,
2323 } ,
24+ spinner : {
25+ alignItems : 'center' ,
26+ justifyContent : 'center' ,
27+ padding : 8 ,
28+ } ,
2429} )
2530
2631type Props = TopLevelViewPropsType & {
2732 applyFilters : ( filters : FilterType [ ] , item : CourseType ) => boolean ,
28- browsing : boolean ,
2933 courses : Array < CourseType > ,
3034 filters : Array < FilterType > ,
3135 onPopoverDismiss : ( filter : FilterType ) => any ,
36+ onListItemPress ?: CourseType => any ,
3237 query : string ,
38+ style ?: any ,
39+ contentContainerStyle ?: any ,
40+ filtersLoaded : boolean ,
3341}
3442
3543function doSearch ( args : {
@@ -63,29 +71,38 @@ export class CourseResultsList extends React.PureComponent<Props> {
6371 )
6472
6573 onPressRow = ( data : CourseType ) => {
74+ if ( this . props . onListItemPress ) {
75+ this . props . onListItemPress ( data )
76+ }
6677 this . props . navigation . navigate ( 'CourseDetailView' , { course : data } )
6778 }
6879
6980 render ( ) {
7081 let {
7182 filters,
72- browsing,
7383 query,
7484 courses,
7585 applyFilters,
7686 onPopoverDismiss,
87+ contentContainerStyle,
88+ style,
89+ filtersLoaded,
7790 } = this . props
7891
7992 // be sure to lowercase the query before calling doSearch, so that the memoization
8093 // doesn't break when nothing's changed except case.
8194 query = query . toLowerCase ( )
8295 let results = memoizedDoSearch ( { query, filters, courses, applyFilters} )
8396
84- const header = (
97+ const header = filtersLoaded ? (
8598 < FilterToolbar filters = { filters } onPopoverDismiss = { onPopoverDismiss } />
99+ ) : (
100+ < ActivityIndicator style = { styles . spinner } />
86101 )
87102
88- const message = browsing
103+ const hasActiveFilter = filters . some ( f => f . enabled )
104+
105+ const message = hasActiveFilter
89106 ? 'There were no courses that matched your selected filters. Try a different filter combination.'
90107 : query . length
91108 ? 'There were no courses that matched your query. Please try again.'
@@ -98,14 +115,14 @@ export class CourseResultsList extends React.PureComponent<Props> {
98115 ItemSeparatorComponent = { ListSeparator }
99116 ListEmptyComponent = { messageView }
100117 ListHeaderComponent = { header }
101- contentContainerStyle = { styles . container }
118+ contentContainerStyle = { [ styles . container , contentContainerStyle ] }
102119 extraData = { this . props }
103120 keyExtractor = { this . keyExtractor }
104- keyboardDismissMode = "on-drag"
105- keyboardShouldPersistTaps = "never"
121+ keyboardDismissMode = "interactive"
106122 renderItem = { this . renderItem }
107123 renderSectionHeader = { this . renderSectionHeader }
108124 sections = { ( results : any ) }
125+ style = { style }
109126 windowSize = { 10 }
110127 />
111128 )
0 commit comments