Skip to content

Commit c7affdf

Browse files
committed
Add same change to react router native
1 parent 4f295bd commit c7affdf

File tree

3 files changed

+74
-5
lines changed

3 files changed

+74
-5
lines changed

packages/react-router-native/__tests__/__snapshots__/search-params-test.tsx.snap

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,30 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3+
exports[`useSearchParams allows removal of search params when a default is provided 1`] = `
4+
<View>
5+
<Text>
6+
The current query is "
7+
initial
8+
".
9+
</Text>
10+
<View>
11+
Click
12+
</View>
13+
</View>
14+
`;
15+
16+
exports[`useSearchParams allows removal of search params when a default is provided 2`] = `
17+
<View>
18+
<Text>
19+
The current query is "
20+
".
21+
</Text>
22+
<View>
23+
Click
24+
</View>
25+
</View>
26+
`;
27+
328
exports[`useSearchParams reads and writes the search string (functional update) 1`] = `
429
<View>
530
<Text>

packages/react-router-native/__tests__/search-params-test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ describe("useSearchParams", () => {
1818
return <View>{children}</View>;
1919
}
2020

21+
function Button({ children }: { children: React.ReactNode; onClick?: any }) {
22+
return <View>{children}</View>;
23+
}
24+
2125
it("reads and writes the search string", () => {
2226
function SearchPage() {
2327
let [searchParams, setSearchParams] = useSearchParams({ q: "" });
@@ -112,4 +116,40 @@ describe("useSearchParams", () => {
112116

113117
expect(renderer.toJSON()).toMatchSnapshot();
114118
});
119+
120+
it("allows removal of search params when a default is provided", () => {
121+
function SearchPage() {
122+
let [searchParams, setSearchParams] = useSearchParams({
123+
value: "initial",
124+
});
125+
126+
return (
127+
<View>
128+
<Text>The current query is "{searchParams.get("value")}".</Text>
129+
<Button onClick={() => setSearchParams({})}>Click</Button>
130+
</View>
131+
);
132+
}
133+
134+
let renderer: TestRenderer.ReactTestRenderer;
135+
TestRenderer.act(() => {
136+
renderer = TestRenderer.create(
137+
<NativeRouter initialEntries={["/search?value=initial"]}>
138+
<Routes>
139+
<Route path="search" element={<SearchPage />} />
140+
</Routes>
141+
</NativeRouter>
142+
);
143+
});
144+
145+
expect(renderer.toJSON()).toMatchSnapshot();
146+
147+
let button = renderer.root.findByType(Button);
148+
149+
TestRenderer.act(() => {
150+
button.props.onClick();
151+
});
152+
153+
expect(renderer.toJSON()).toMatchSnapshot();
154+
});
115155
});

packages/react-router-native/index.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,16 +288,19 @@ export function useSearchParams(
288288
defaultInit?: URLSearchParamsInit
289289
): [URLSearchParams, SetURLSearchParams] {
290290
let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));
291+
let hasSetSearchParamsRef = React.useRef(false);
291292

292293
let location = useLocation();
293294
let searchParams = React.useMemo(() => {
294295
let searchParams = createSearchParams(location.search);
295296

296-
for (let key of defaultSearchParamsRef.current.keys()) {
297-
if (!searchParams.has(key)) {
298-
defaultSearchParamsRef.current.getAll(key).forEach((value) => {
299-
searchParams.append(key, value);
300-
});
297+
if (!hasSetSearchParamsRef.current) {
298+
for (let key of defaultSearchParamsRef.current.keys()) {
299+
if (!searchParams.has(key)) {
300+
defaultSearchParamsRef.current.getAll(key).forEach((value) => {
301+
searchParams.append(key, value);
302+
});
303+
}
301304
}
302305
}
303306

@@ -310,6 +313,7 @@ export function useSearchParams(
310313
const newSearchParams = createSearchParams(
311314
typeof nextInit === "function" ? nextInit(searchParams) : nextInit
312315
);
316+
hasSetSearchParamsRef.current = true;
313317
navigate("?" + newSearchParams, navigateOpts);
314318
},
315319
[navigate, searchParams]

0 commit comments

Comments
 (0)