Skip to content

Commit 0885825

Browse files
committed
ref: Keep RR adapters simple, factor out implementation
1 parent c1ac43b commit 0885825

File tree

4 files changed

+36
-56
lines changed

4 files changed

+36
-56
lines changed

packages/nuqs/src/adapters/lib/react-router.ts

+18-12
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import mitt from 'mitt'
22
import { startTransition, useCallback, useEffect, useState } from 'react'
33
import { renderQueryString } from '../../url-encoding'
4+
import { createAdapterProvider } from './context'
45
import type { AdapterInterface, AdapterOptions } from './defs'
56
import {
7+
patchHistory as applyHistoryPatch,
68
historyUpdateMarker,
7-
patchHistory,
89
type SearchParamsSyncEmitter
910
} from './patch-history'
1011

@@ -24,11 +25,17 @@ type UseSearchParams = (initial: URLSearchParams) => [URLSearchParams, {}]
2425

2526
// --
2627

27-
export function createReactRouterBasedAdapter(
28-
adapter: string,
29-
useNavigate: UseNavigate,
28+
type CreateReactRouterBasedAdapterArgs = {
29+
adapter: string
30+
useNavigate: UseNavigate
3031
useSearchParams: UseSearchParams
31-
) {
32+
}
33+
34+
export function createReactRouterBasedAdapter({
35+
adapter,
36+
useNavigate,
37+
useSearchParams
38+
}: CreateReactRouterBasedAdapterArgs) {
3239
const emitter: SearchParamsSyncEmitter = mitt()
3340
function useNuqsReactRouterBasedAdapter(): AdapterInterface {
3441
const navigate = useNavigate()
@@ -112,19 +119,18 @@ export function createReactRouterBasedAdapter(
112119
return searchParams
113120
}
114121
/**
115-
* Opt-in to syncing shallow updates of the URL with the useOptimisticSearchParams hook.
122+
* Sync shallow updates of the URL with the useOptimisticSearchParams hook.
116123
*
117124
* By default, the useOptimisticSearchParams hook will only react to internal nuqs updates.
118125
* If third party code updates the History API directly, use this function to
119126
* enable useOptimisticSearchParams to react to those changes.
127+
*
128+
* Note: this is actually required in React Router frameworks to follow Link navigations.
120129
*/
121-
function enableHistorySync() {
122-
patchHistory(emitter, adapter)
123-
}
130+
applyHistoryPatch(emitter, adapter)
124131

125132
return {
126-
useNuqsReactRouterBasedAdapter,
127-
useOptimisticSearchParams,
128-
enableHistorySync
133+
NuqsAdapter: createAdapterProvider(useNuqsReactRouterBasedAdapter),
134+
useOptimisticSearchParams
129135
}
130136
}
+6-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,9 @@
11
import { useNavigate, useSearchParams } from 'react-router-dom'
2-
import { createAdapterProvider } from '../lib/context'
32
import { createReactRouterBasedAdapter } from '../lib/react-router'
43

5-
const {
6-
enableHistorySync,
7-
useNuqsReactRouterBasedAdapter: useNuqsReactRouterV6Adapter,
8-
useOptimisticSearchParams
9-
} = createReactRouterBasedAdapter(
10-
'react-router-v6',
11-
useNavigate,
12-
useSearchParams
13-
)
14-
15-
export { useOptimisticSearchParams }
16-
17-
export const NuqsAdapter = createAdapterProvider(useNuqsReactRouterV6Adapter)
18-
19-
enableHistorySync()
4+
export const { NuqsAdapter, useOptimisticSearchParams } =
5+
createReactRouterBasedAdapter({
6+
adapter: 'react-router-v6',
7+
useNavigate,
8+
useSearchParams
9+
})
+6-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,9 @@
11
import { useNavigate, useSearchParams } from 'react-router'
2-
import { createAdapterProvider } from '../lib/context'
32
import { createReactRouterBasedAdapter } from '../lib/react-router'
43

5-
const {
6-
enableHistorySync,
7-
useNuqsReactRouterBasedAdapter: useNuqsReactRouterV7Adapter,
8-
useOptimisticSearchParams
9-
} = createReactRouterBasedAdapter(
10-
'react-router-v7',
11-
useNavigate,
12-
useSearchParams
13-
)
14-
15-
export { useOptimisticSearchParams }
16-
17-
export const NuqsAdapter = createAdapterProvider(useNuqsReactRouterV7Adapter)
18-
19-
enableHistorySync()
4+
export const { NuqsAdapter, useOptimisticSearchParams } =
5+
createReactRouterBasedAdapter({
6+
adapter: 'react-router-v7',
7+
useNavigate,
8+
useSearchParams
9+
})

packages/nuqs/src/adapters/remix.ts

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
import { useNavigate, useSearchParams } from '@remix-run/react'
2-
import { createAdapterProvider } from './lib/context'
32
import { createReactRouterBasedAdapter } from './lib/react-router'
43

5-
const {
6-
enableHistorySync,
7-
useNuqsReactRouterBasedAdapter: useNuqsRemixAdapter,
8-
useOptimisticSearchParams
9-
} = createReactRouterBasedAdapter('remix', useNavigate, useSearchParams)
10-
11-
export { useOptimisticSearchParams }
12-
13-
export const NuqsAdapter = createAdapterProvider(useNuqsRemixAdapter)
14-
15-
enableHistorySync()
4+
export const { NuqsAdapter, useOptimisticSearchParams } =
5+
createReactRouterBasedAdapter({
6+
adapter: 'remix',
7+
useNavigate,
8+
useSearchParams
9+
})

0 commit comments

Comments
 (0)