@@ -14,7 +14,7 @@ import {
1414 Text ,
1515 Tray ,
1616} from 'opub-ui' ;
17- import React , { useEffect , useReducer , useRef , useState } from 'react' ;
17+ import React , { useEffect , useMemo , useReducer , useRef , useState } from 'react' ;
1818
1919import BreadCrumbs from '@/components/BreadCrumbs' ;
2020import { Icons } from '@/components/icons' ;
@@ -149,7 +149,8 @@ const queryReducer = (state: QueryParams, action: Action): QueryParams => {
149149const useUrlParams = (
150150 queryParams : QueryParams ,
151151 setQueryParams : React . Dispatch < Action > ,
152- setVariables : ( vars : string ) => void
152+ setVariables : ( vars : string ) => void ,
153+ lockedFilters : Record < string , string [ ] >
153154) => {
154155 const router = useRouter ( ) ;
155156
@@ -165,6 +166,13 @@ const useUrlParams = (
165166 }
166167 } ) ;
167168
169+ // Merge locked filters with URL filters
170+ Object . entries ( lockedFilters ) . forEach ( ( [ category , values ] ) => {
171+ if ( values . length > 0 ) {
172+ filters [ category ] = Array . from ( new Set ( [ ...( filters [ category ] || [ ] ) , ...values ] ) ) ;
173+ }
174+ } ) ;
175+
168176 const initialParams : QueryParams = {
169177 pageSize : sizeParam ? Number ( sizeParam ) : 9 ,
170178 currentPage : pageParam ? Number ( pageParam ) : 1 ,
@@ -173,7 +181,7 @@ const useUrlParams = (
173181 } ;
174182
175183 setQueryParams ( { type : 'INITIALIZE' , payload : initialParams } ) ;
176- } , [ setQueryParams ] ) ;
184+ } , [ setQueryParams , lockedFilters ] ) ;
177185
178186 useEffect ( ( ) => {
179187 const filtersString = Object . entries ( queryParams . filters )
@@ -234,6 +242,7 @@ interface ListingProps {
234242 categoryImage ?: string ;
235243 placeholder : string ;
236244 redirectionURL : string ;
245+ lockedFilters ?: Record < string , string [ ] > ;
237246}
238247
239248const ListingComponent : React . FC < ListingProps > = ( {
@@ -245,6 +254,7 @@ const ListingComponent: React.FC<ListingProps> = ({
245254 categoryImage,
246255 placeholder,
247256 redirectionURL,
257+ lockedFilters = { } ,
248258} ) => {
249259 const [ facets , setFacets ] = useState < {
250260 results : any [ ] ;
@@ -259,7 +269,10 @@ const ListingComponent: React.FC<ListingProps> = ({
259269 const count = facets ?. total ?? 0 ;
260270 const datasetDetails = facets ?. results ?? [ ] ;
261271
262- useUrlParams ( queryParams , setQueryParams , setVariables ) ;
272+ // Stabilize lockedFilters reference to prevent infinite loops
273+ const stableLockedFilters = useMemo ( ( ) => lockedFilters , [ JSON . stringify ( lockedFilters ) ] ) ;
274+
275+ useUrlParams ( queryParams , setQueryParams , setVariables , stableLockedFilters ) ;
263276 const latestFetchId = useRef ( 0 ) ;
264277
265278 useEffect ( ( ) => {
@@ -389,6 +402,7 @@ const ListingComponent: React.FC<ListingProps> = ({
389402 options = { filterOptions }
390403 setSelectedOptions = { handleFilterChange }
391404 selectedOptions = { queryParams . filters }
405+ lockedFilters = { stableLockedFilters }
392406 />
393407 </ div >
394408
@@ -484,6 +498,7 @@ const ListingComponent: React.FC<ListingProps> = ({
484498 options = { filterOptions }
485499 setSelectedOptions = { handleFilterChange }
486500 selectedOptions = { queryParams . filters }
501+ lockedFilters = { stableLockedFilters }
487502 />
488503 </ Tray >
489504 </ div >
@@ -497,14 +512,18 @@ const ListingComponent: React.FC<ListingProps> = ({
497512 ( [ category , values ] ) =>
498513 values
499514 . filter ( ( value ) => category !== 'sort' )
500- . map ( ( value ) => (
501- < Pill
502- key = { `${ category } -${ value } ` }
503- onRemove = { ( ) => handleRemoveFilter ( category , value ) }
504- >
505- { value }
506- </ Pill >
507- ) )
515+ . map ( ( value ) => {
516+ // Check if this filter value is locked
517+ const isLocked = stableLockedFilters [ category ] ?. includes ( value ) ;
518+ return (
519+ < Pill
520+ key = { `${ category } -${ value } ` }
521+ onRemove = { isLocked ? undefined : ( ) => handleRemoveFilter ( category , value ) }
522+ >
523+ { value }
524+ </ Pill >
525+ ) ;
526+ } )
508527 ) }
509528 </ div >
510529 ) }
0 commit comments