@@ -4,7 +4,12 @@ import {
4
4
withNuqsTestingAdapter ,
5
5
type OnUrlUpdateFunction
6
6
} from './adapters/testing'
7
- import { parseAsArrayOf , parseAsJson , parseAsString } from './parsers'
7
+ import {
8
+ parseAsArrayOf ,
9
+ parseAsInteger ,
10
+ parseAsJson ,
11
+ parseAsString
12
+ } from './parsers'
8
13
import { useQueryStates } from './useQueryStates'
9
14
10
15
describe ( 'useQueryStates' , ( ) => {
@@ -316,3 +321,64 @@ describe('useQueryStates: clearOnDefault', () => {
316
321
expect ( onUrlUpdate . mock . calls [ 0 ] ! [ 0 ] . queryString ) . toEqual ( '' )
317
322
} )
318
323
} )
324
+
325
+ describe ( 'useQueryStates: dynamic keys' , ( ) => {
326
+ it ( 'supports dynamic keys' , ( ) => {
327
+ const useTestHook = ( keys : string [ ] = [ 'a' , 'b' ] ) =>
328
+ useQueryStates ( {
329
+ [ keys [ 0 ] ! ] : parseAsInteger ,
330
+ [ keys [ 1 ] ! ] : parseAsInteger
331
+ } )
332
+ const { result, rerender } = renderHook ( useTestHook , {
333
+ wrapper : withNuqsTestingAdapter ( {
334
+ searchParams : '?a=1&b=2&c=3&d=4'
335
+ } )
336
+ } )
337
+ expect ( result . current [ 0 ] . a ) . toEqual ( 1 )
338
+ expect ( result . current [ 0 ] . b ) . toEqual ( 2 )
339
+ expect ( result . current [ 0 ] . c ) . toBeUndefined ( )
340
+ expect ( result . current [ 0 ] . d ) . toBeUndefined ( )
341
+ rerender ( [ 'c' , 'd' ] )
342
+ expect ( result . current [ 0 ] . a ) . toBeUndefined ( )
343
+ expect ( result . current [ 0 ] . b ) . toBeUndefined ( )
344
+ expect ( result . current [ 0 ] . c ) . toEqual ( 3 )
345
+ expect ( result . current [ 0 ] . d ) . toEqual ( 4 )
346
+ } )
347
+
348
+ it ( 'supports dynamic keys with remapping' , ( ) => {
349
+ const useTestHook = ( keys : string [ ] = [ 'a' , 'b' ] ) =>
350
+ useQueryStates (
351
+ {
352
+ [ keys [ 0 ] ! ] : parseAsInteger ,
353
+ [ keys [ 1 ] ! ] : parseAsInteger
354
+ } ,
355
+ {
356
+ urlKeys : {
357
+ a : 'x' ,
358
+ b : 'y' ,
359
+ c : 'z'
360
+ }
361
+ }
362
+ )
363
+ const { result, rerender } = renderHook ( useTestHook , {
364
+ wrapper : withNuqsTestingAdapter ( {
365
+ searchParams : '?x=1&y=2&z=3'
366
+ } )
367
+ } )
368
+ expect ( result . current [ 0 ] . a ) . toEqual ( 1 )
369
+ expect ( result . current [ 0 ] . b ) . toEqual ( 2 )
370
+ expect ( result . current [ 0 ] . c ) . toBeUndefined ( )
371
+ expect ( result . current [ 0 ] . d ) . toBeUndefined ( )
372
+ expect ( result . current [ 0 ] . x ) . toBeUndefined ( )
373
+ expect ( result . current [ 0 ] . y ) . toBeUndefined ( )
374
+ expect ( result . current [ 0 ] . z ) . toBeUndefined ( )
375
+ rerender ( [ 'c' , 'd' ] )
376
+ expect ( result . current [ 0 ] . a ) . toBeUndefined ( )
377
+ expect ( result . current [ 0 ] . b ) . toBeUndefined ( )
378
+ expect ( result . current [ 0 ] . c ) . toEqual ( 3 )
379
+ expect ( result . current [ 0 ] . d ) . toBeNull ( )
380
+ expect ( result . current [ 0 ] . x ) . toBeUndefined ( )
381
+ expect ( result . current [ 0 ] . y ) . toBeUndefined ( )
382
+ expect ( result . current [ 0 ] . z ) . toBeUndefined ( )
383
+ } )
384
+ } )
0 commit comments