Skip to content

Commit a597df1

Browse files
committed
Fix Navigate doesn't handle location objects
1 parent f726243 commit a597df1

3 files changed

Lines changed: 65 additions & 6 deletions

File tree

packages/ra-router-tanstack/src/tanStackRouterProvider.spec.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,27 @@ describe('tanStackRouterProvider', () => {
10841084
});
10851085
});
10861086

1087+
it('should preserve search params on redirect', async () => {
1088+
render(<NavigateComponent />);
1089+
await waitFor(() => {
1090+
expect(screen.getByTestId('posts-page')).toBeInTheDocument();
1091+
});
1092+
1093+
fireEvent.click(screen.getByText('Go to redirect with params'));
1094+
1095+
// Should immediately redirect back to posts with search params
1096+
await waitFor(() => {
1097+
expect(screen.getByTestId('posts-page')).toBeInTheDocument();
1098+
});
1099+
1100+
expect(
1101+
screen.getByText(/\"pathname\": \"\/posts\"/)
1102+
).toBeInTheDocument();
1103+
expect(
1104+
screen.getByText(/\"search\": \"\?foo=bar\"/)
1105+
).toBeInTheDocument();
1106+
});
1107+
10871108
it('should redirect conditionally when state changes', async () => {
10881109
render(<NavigateComponent />);
10891110
await waitFor(() => {

packages/ra-router-tanstack/src/tanStackRouterProvider.stories.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,15 @@ export const UseBlockerTest = () => {
852852
};
853853

854854
export const NavigateComponent = () => {
855+
const DummyPage = () => {
856+
return (
857+
<div>
858+
<p>Dummy page</p>
859+
<Navigate to={{ pathname: '/posts', search: '?foo=bar' }} />
860+
</div>
861+
);
862+
};
863+
855864
const RedirectPage = () => {
856865
return (
857866
<div>
@@ -887,8 +896,10 @@ export const NavigateComponent = () => {
887896
<CoreAdmin
888897
routerProvider={tanStackRouterProvider}
889898
dataProvider={dataProvider}
899+
layout={LayoutWithLocationDisplay}
890900
>
891901
<CustomRoutes>
902+
<Route path="/dummy" element={<DummyPage />} />
892903
<Route path="/redirect" element={<RedirectPage />} />
893904
<Route
894905
path="/conditional-redirect"
@@ -914,8 +925,12 @@ export const NavigateComponent = () => {
914925
Go to Conditional Redirect
915926
</LinkBase>
916927
</li>
928+
<li>
929+
<LinkBase to="/dummy">
930+
Go to redirect with params
931+
</LinkBase>
932+
</li>
917933
</ul>
918-
<LocationDisplay />
919934
</div>
920935
}
921936
/>

packages/ra-router-tanstack/src/tanStackRouterProvider.tsx

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -472,18 +472,41 @@ Link.displayName = 'Link';
472472
const Navigate = ({ to, replace, state }: RouterNavigateProps) => {
473473
const basename = useBasename();
474474

475+
// Handle both string and object forms of `to`
476+
let resolvedPath: string;
477+
let search: string | undefined;
478+
let hash: string | undefined;
479+
480+
if (typeof to === 'string') {
481+
resolvedPath = to;
482+
} else {
483+
resolvedPath = to.pathname || '/';
484+
search = to.search;
485+
hash = to.hash;
486+
// Merge state from object with state prop (prop takes precedence)
487+
state = state ?? to.state;
488+
}
489+
475490
// Prepend basename to the path (like react-router does)
476491
// Only prepend if path doesn't already start with basename
477-
let resolvedTo = to;
478-
if (typeof to === 'string' && basename && to.startsWith('/')) {
479-
if (!to.startsWith(basename + '/') && to !== basename) {
480-
resolvedTo = `${basename}${to}`;
492+
if (basename && resolvedPath.startsWith('/')) {
493+
if (
494+
!resolvedPath.startsWith(basename + '/') &&
495+
resolvedPath !== basename
496+
) {
497+
resolvedPath = `${basename}${resolvedPath}`;
481498
}
482499
}
483500

484501
return (
485502
<TanStackNavigate
486-
to={resolvedTo as string}
503+
to={resolvedPath}
504+
search={
505+
search
506+
? Object.fromEntries(new URLSearchParams(search))
507+
: undefined
508+
}
509+
hash={hash}
487510
replace={replace}
488511
state={state}
489512
/>

0 commit comments

Comments
 (0)