@@ -9,9 +9,11 @@ import {
99 type ColumnDef ,
1010} from "@tanstack/react-table" ;
1111import {
12+ COLLECTION_TAG_VALUES ,
1213 setsForBrandFilter ,
1314 variationsForFilters ,
1415 type CollectionSortKey ,
16+ type CollectionTagValue ,
1517} from "@/lib/collection-query" ;
1618import { Card , type References } from "@/lib/types" ;
1719import { CardBadges } from "@/components/card-badges" ;
@@ -115,11 +117,10 @@ export function CardTable({
115117 const { filters : urlFilters , updateFilters, toggleSort, isPending } =
116118 useCollectionUrlFilters ( ) ;
117119
118- const rookieOnly = urlFilters . tag === "rookie" ;
119- const autoOnly = urlFilters . tag === "autograph" ;
120- const memoOnly = urlFilters . tag === "memorabilia" ;
121- const serialOnly = urlFilters . tag === "numbered" ;
122- const tradableOnly = urlFilters . tag === "tradable" ;
120+ const selectedTags = useMemo (
121+ ( ) => new Set ( urlFilters . tags ) ,
122+ [ urlFilters . tags ]
123+ ) ;
123124
124125 function sortState ( column : CollectionSortKey ) : false | "asc" | "desc" {
125126 if ( urlFilters . sort !== column ) return false ;
@@ -265,11 +266,11 @@ export function CardTable({
265266 }
266267 } , [ urlFilters . variation , variationSuggestions , updateFilters ] ) ;
267268
268- function toggleTag ( tag : typeof urlFilters . tag ) {
269- updateFilters (
270- { tag : urlFilters . tag = == tag ? "" : tag } ,
271- { immediate : true }
272- ) ;
269+ function toggleTag ( tag : CollectionTagValue ) {
270+ const next = selectedTags . has ( tag )
271+ ? urlFilters . tags . filter ( ( value ) => value ! == tag )
272+ : [ ... urlFilters . tags , tag ] ;
273+ updateFilters ( { tags : next } , { immediate : true } ) ;
273274 }
274275
275276 const activeFilters = useMemo (
@@ -290,21 +291,9 @@ export function CardTable({
290291 urlFilters . variation
291292 ? t ( "cards.activeVariation" , { value : urlFilters . variation } )
292293 : "" ,
293- rookieOnly ? t ( "badges.rookie" ) : "" ,
294- autoOnly ? t ( "badges.autograph" ) : "" ,
295- memoOnly ? t ( "badges.memorabilia" ) : "" ,
296- serialOnly ? t ( "badges.numbered" ) : "" ,
297- tradableOnly ? t ( "badges.tradable" ) : "" ,
294+ ...urlFilters . tags . map ( ( tag ) => badgeLabels [ tag ] ) ,
298295 ] . filter ( Boolean ) ,
299- [
300- autoOnly ,
301- memoOnly ,
302- rookieOnly ,
303- serialOnly ,
304- t ,
305- tradableOnly ,
306- urlFilters ,
307- ]
296+ [ badgeLabels , t , urlFilters ]
308297 ) ;
309298
310299 return (
@@ -381,26 +370,14 @@ export function CardTable({
381370 />
382371
383372 < div className = "flex flex-wrap gap-1 sm:col-span-2 lg:col-span-1" >
384- < FilterChipButton
385- label = { t ( "badges.rookie" ) }
386- pressed = { rookieOnly }
387- onPressedChange = { ( ) => toggleTag ( "rookie" ) }
388- />
389- < FilterChipButton
390- label = { t ( "badges.autograph" ) }
391- pressed = { autoOnly }
392- onPressedChange = { ( ) => toggleTag ( "autograph" ) }
393- />
394- < FilterChipButton
395- label = { t ( "badges.memorabilia" ) }
396- pressed = { memoOnly }
397- onPressedChange = { ( ) => toggleTag ( "memorabilia" ) }
398- />
399- < FilterChipButton
400- label = { t ( "badges.numbered" ) }
401- pressed = { serialOnly }
402- onPressedChange = { ( ) => toggleTag ( "numbered" ) }
403- />
373+ { COLLECTION_TAG_VALUES . map ( ( tag ) => (
374+ < FilterChipButton
375+ key = { tag }
376+ label = { badgeLabels [ tag ] }
377+ pressed = { selectedTags . has ( tag ) }
378+ onPressedChange = { ( ) => toggleTag ( tag ) }
379+ />
380+ ) ) }
404381 </ div >
405382 </ div >
406383
0 commit comments