Skip to content

Commit 318d324

Browse files
committed
doc: Query spy follows encoding
Using a hack around the serializer to apply the same encoding as the hooks would in the URL.
1 parent 6294313 commit 318d324

File tree

1 file changed

+25
-5
lines changed
  • packages/docs/src/app/playground/(demos)/_components

1 file changed

+25
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,52 @@
11
'use client'
22

33
import { useSearchParams } from 'next/navigation'
4+
import { createSerializer } from 'nuqs/server'
45
import React from 'react'
56
import { QuerySpySkeleton } from './query-spy.skeleton'
67

8+
const serialize = createSerializer({})
9+
710
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+
916
return (
1017
<QuerySpySkeleton {...props}>
11-
{searchParams.size > 0 && (
18+
{searchParams.length > 0 && (
1219
<span className="text-zinc-500">
1320
?
14-
{Array.from(searchParams.entries()).map(([key, value], i) => (
21+
{searchParams.map(([key, value], i) => (
1522
<React.Fragment key={key + i}>
1623
<span className="text-[#005CC5] dark:text-[#79B8FF]">{key}</span>=
1724
<span className="text-[#D73A49] dark:text-[#F97583]">
1825
{value}
1926
</span>
20-
{i < searchParams.size - 1 && (
27+
{i < searchParams.length - 1 && (
2128
<span className="text-zinc-500">&</span>
2229
)}
2330
</React.Fragment>
2431
))}
2532
</span>
2633
)}
27-
{searchParams.size === 0 && (
34+
{searchParams.length === 0 && (
2835
<span className="italic text-zinc-500">{'<empty query>'}</span>
2936
)}
3037
</QuerySpySkeleton>
3138
)
3239
}
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

Comments
 (0)