@@ -30,8 +30,10 @@ import { useSearchParams } from 'react-router-dom';
3030import SearchTable from './SearchTable' ;
3131import { Trans , useTranslation } from 'react-i18next' ;
3232import {
33+ type AllowedFeedSearchStatus ,
3334 getDataTypeParamFromSelectedFeedTypes ,
3435 getInitialSelectedFeedTypes ,
36+ parseQueryParamStatus ,
3537} from './utility' ;
3638import {
3739 chipHolderStyles ,
@@ -65,6 +67,9 @@ export default function Feed(): React.ReactElement {
6567 const [ selectedFeatures , setSelectedFeatures ] = useState < string [ ] > (
6668 searchParams . get ( 'features' ) ?. split ( ',' ) ?? [ ] ,
6769 ) ;
70+ const [ selectedStatuses , setSelectedStatuses ] = useState <
71+ AllowedFeedSearchStatus [ ]
72+ > ( parseQueryParamStatus ( searchParams . get ( 'status' ) ?. split ( ',' ) ) ) ;
6873 const [ selectGbfsVersions , setSelectGbfsVersions ] = useState < string [ ] > (
6974 searchParams . get ( 'gbfs_versions' ) ?. split ( ',' ) ?? [ ] ,
7075 ) ;
@@ -94,6 +99,9 @@ export default function Feed(): React.ReactElement {
9499 const areFeatureFiltersEnabled =
95100 ( ! selectedFeedTypes . gtfs_rt && ! selectedFeedTypes . gbfs ) ||
96101 selectedFeedTypes . gtfs ;
102+ const areStatusFiltersEnabled =
103+ ( ! selectedFeedTypes . gtfs_rt && ! selectedFeedTypes . gbfs ) ||
104+ selectedFeedTypes . gtfs ;
97105 const areGBFSFiltersEnabled =
98106 selectedFeedTypes . gbfs &&
99107 ! selectedFeedTypes . gtfs_rt &&
@@ -125,9 +133,10 @@ export default function Feed(): React.ReactElement {
125133 is_official : isOfficialTagFilterEnabled
126134 ? isOfficialFeedSearch || undefined
127135 : undefined ,
128- // Fixed status values for now, until a status filter is implemented
129- // Filtering out deprecated feeds
130- status : [ 'active' , 'inactive' , 'development' , 'future' ] ,
136+ status :
137+ areStatusFiltersEnabled && selectedStatuses . length > 0
138+ ? selectedStatuses
139+ : [ 'active' , 'inactive' , 'development' , 'future' ] ,
131140 feature : areFeatureFiltersEnabled ? selectedFeatures : undefined ,
132141 version : areGBFSFiltersEnabled
133142 ? selectGbfsVersions . join ( ',' ) . replaceAll ( 'v' , '' )
@@ -144,6 +153,7 @@ export default function Feed(): React.ReactElement {
144153 searchLimit ,
145154 isOfficialFeedSearch ,
146155 selectedFeatures ,
156+ selectedStatuses ,
147157 selectGbfsVersions ,
148158 ] ) ;
149159
@@ -168,6 +178,9 @@ export default function Feed(): React.ReactElement {
168178 if ( selectedFeatures . length > 0 ) {
169179 newSearchParams . set ( 'features' , selectedFeatures . join ( ',' ) ) ;
170180 }
181+ if ( selectedStatuses . length > 0 ) {
182+ newSearchParams . set ( 'status' , selectedStatuses . join ( ',' ) ) ;
183+ }
171184 if ( selectGbfsVersions . length > 0 ) {
172185 newSearchParams . set ( 'gbfs_versions' , selectGbfsVersions . join ( ',' ) ) ;
173186 }
@@ -185,6 +198,7 @@ export default function Feed(): React.ReactElement {
185198 activePagination ,
186199 selectedFeedTypes ,
187200 selectedFeatures ,
201+ selectedStatuses ,
188202 selectGbfsVersions ,
189203 isOfficialFeedSearch ,
190204 ] ) ;
@@ -208,6 +222,12 @@ export default function Feed(): React.ReactElement {
208222 setSelectedFeatures ( [ ...newFeatures ] ) ;
209223 }
210224
225+ const newStatusesRaw = searchParams . get ( 'status' ) ?. split ( ',' ) ?? [ ] ;
226+ const newStatuses = parseQueryParamStatus ( newStatusesRaw ) ;
227+ if ( newStatuses . join ( ',' ) !== selectedStatuses . join ( ',' ) ) {
228+ setSelectedStatuses ( [ ...newStatuses ] ) ;
229+ }
230+
211231 const newGbfsVersions = searchParams . get ( 'gbfs_versions' ) ?. split ( ',' ) ?? [ ] ;
212232 if ( newGbfsVersions . join ( ',' ) !== selectGbfsVersions . join ( ',' ) ) {
213233 setSelectGbfsVersions ( [ ...newGbfsVersions ] ) ;
@@ -263,6 +283,7 @@ export default function Feed(): React.ReactElement {
263283 gbfs : false ,
264284 } ) ;
265285 setSelectedFeatures ( [ ] ) ;
286+ setSelectedStatuses ( [ ] ) ;
266287 setSelectGbfsVersions ( [ ] ) ;
267288 setIsOfficialFeedSearch ( false ) ;
268289 }
@@ -400,6 +421,7 @@ export default function Feed(): React.ReactElement {
400421 selectedFeedTypes = { selectedFeedTypes }
401422 isOfficialFeedSearch = { isOfficialFeedSearch }
402423 selectedFeatures = { selectedFeatures }
424+ selectedStatuses = { selectedStatuses }
403425 selectedGbfsVersions = { selectGbfsVersions }
404426 setSelectedFeedTypes = { ( feedTypes ) => {
405427 setActivePagination ( 1 ) ;
@@ -413,12 +435,17 @@ export default function Feed(): React.ReactElement {
413435 setActivePagination ( 1 ) ;
414436 setSelectedFeatures ( features ) ;
415437 } }
438+ setSelectedStatuses = { ( statuses ) => {
439+ setActivePagination ( 1 ) ;
440+ setSelectedStatuses ( statuses ) ;
441+ } }
416442 setSelectedGbfsVerions = { ( versions ) => {
417443 setSelectGbfsVersions ( versions ) ;
418444 setActivePagination ( 1 ) ;
419445 } }
420446 isOfficialTagFilterEnabled = { isOfficialTagFilterEnabled }
421447 areFeatureFiltersEnabled = { areFeatureFiltersEnabled }
448+ areStatusFiltersEnabled = { areStatusFiltersEnabled }
422449 areGBFSFiltersEnabled = { areGBFSFiltersEnabled }
423450 > </ SearchFilters >
424451 </ Grid >
@@ -498,6 +525,22 @@ export default function Feed(): React.ReactElement {
498525 />
499526 ) ) }
500527
528+ { areStatusFiltersEnabled &&
529+ selectedStatuses . map ( ( status ) => (
530+ < Chip
531+ color = 'primary'
532+ variant = 'outlined'
533+ size = 'small'
534+ label = { t ( 'feedStatus.' + status + '.label' ) }
535+ key = { status }
536+ onDelete = { ( ) => {
537+ setSelectedStatuses ( [
538+ ...selectedStatuses . filter ( ( s ) => s !== status ) ,
539+ ] ) ;
540+ } }
541+ />
542+ ) ) }
543+
501544 { areGBFSFiltersEnabled &&
502545 selectGbfsVersions . map ( ( gbfsVersion ) => (
503546 < Chip
@@ -517,6 +560,7 @@ export default function Feed(): React.ReactElement {
517560 ) ) }
518561
519562 { ( selectedFeatures . length > 0 ||
563+ selectedStatuses . length > 0 ||
520564 selectGbfsVersions . length > 0 ||
521565 isOfficialFeedSearch ||
522566 selectedFeedTypes . gtfs_rt ||
0 commit comments