|
1 | 1 | 'use client'
|
2 | 2 |
|
3 | 3 | import { useSearchParams } from 'next/navigation'
|
| 4 | +import { createSerializer } from 'nuqs/server' |
4 | 5 | import React from 'react'
|
5 | 6 | import { QuerySpySkeleton } from './query-spy.skeleton'
|
6 | 7 |
|
| 8 | +const serialize = createSerializer({}) |
| 9 | + |
7 | 10 | export function QuerySpy(props: React.ComponentProps<'pre'>) {
|
8 |
| - const searchParams = useSearchParams() |
| 11 | + useSearchParams() // Just using it to trigger re-render on query change |
| 12 | + const searchParams = parseQuery( |
| 13 | + serialize(new URLSearchParams(location.search), {}).slice(1) // Remove leading '?' |
| 14 | + ) |
| 15 | + |
9 | 16 | return (
|
10 | 17 | <QuerySpySkeleton {...props}>
|
11 |
| - {searchParams.size > 0 && ( |
| 18 | + {searchParams.length > 0 && ( |
12 | 19 | <span className="text-zinc-500">
|
13 | 20 | ?
|
14 |
| - {Array.from(searchParams.entries()).map(([key, value], i) => ( |
| 21 | + {searchParams.map(([key, value], i) => ( |
15 | 22 | <React.Fragment key={key + i}>
|
16 | 23 | <span className="text-[#005CC5] dark:text-[#79B8FF]">{key}</span>=
|
17 | 24 | <span className="text-[#D73A49] dark:text-[#F97583]">
|
18 | 25 | {value}
|
19 | 26 | </span>
|
20 |
| - {i < searchParams.size - 1 && ( |
| 27 | + {i < searchParams.length - 1 && ( |
21 | 28 | <span className="text-zinc-500">&</span>
|
22 | 29 | )}
|
23 | 30 | </React.Fragment>
|
24 | 31 | ))}
|
25 | 32 | </span>
|
26 | 33 | )}
|
27 |
| - {searchParams.size === 0 && ( |
| 34 | + {searchParams.length === 0 && ( |
28 | 35 | <span className="italic text-zinc-500">{'<empty query>'}</span>
|
29 | 36 | )}
|
30 | 37 | </QuerySpySkeleton>
|
31 | 38 | )
|
32 | 39 | }
|
| 40 | + |
| 41 | +function parseQuery(queryString: string): [string, string][] { |
| 42 | + const elements = queryString.split('&') |
| 43 | + if (elements.length === 0) return [] |
| 44 | + return elements.reduce( |
| 45 | + (acc, element) => { |
| 46 | + if (element === '') return acc |
| 47 | + const [key, value] = element.split('=') |
| 48 | + return [...acc, [key, value]] |
| 49 | + }, |
| 50 | + [] as [string, string][] |
| 51 | + ) |
| 52 | +} |
0 commit comments