Skip to content

Commit 8283c84

Browse files
authored
Merge pull request #10763 from carloshv93/hotfix/10172-reject_promise_in_checkError_with_logoutUser_false_and_without_redirectTo_causes_an_error
fix(useLogoutAccessDenied): handle errors without redirect
2 parents 6bdd398 + f49c386 commit 8283c84

File tree

2 files changed

+45
-9
lines changed

2 files changed

+45
-9
lines changed

packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,34 @@ describe('useLogoutIfAccessDenied', () => {
258258
expect(screen.queryByText('unauthorized')).not.toBeNull();
259259
});
260260
});
261+
262+
it('should stay on same page if error have no redirectTo', async () => {
263+
render(
264+
<TestMemoryRouter>
265+
<AuthContext.Provider
266+
value={{
267+
...authProvider,
268+
checkError: () => {
269+
return Promise.reject({
270+
logoutUser: false,
271+
message: 'Access denied',
272+
});
273+
},
274+
}}
275+
>
276+
<Routes>
277+
<Route path="/" element={<TestComponent />} />
278+
<Route path="/login" element={<div>Login page</div>} />
279+
</Routes>
280+
</AuthContext.Provider>
281+
</TestMemoryRouter>
282+
);
283+
await waitFor(() => {
284+
expect(authProvider.logout).toHaveBeenCalledTimes(0);
285+
expect(notify).toHaveBeenCalledWith('Access denied', {
286+
type: 'error',
287+
});
288+
expect(notify).toHaveBeenCalledTimes(1);
289+
});
290+
});
261291
});

packages/ra-core/src/auth/useLogoutIfAccessDenied.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => {
4343
const logout = useLogout();
4444
const notify = useNotify();
4545
const navigate = useNavigate();
46+
47+
const handleRedirect = useCallback(
48+
(url: string) => {
49+
if (url.startsWith('http')) {
50+
window.location.href = url;
51+
} else {
52+
navigate(url);
53+
}
54+
},
55+
[navigate]
56+
);
57+
4658
const logoutIfAccessDenied = useCallback(
4759
(error?: any) => {
4860
if (!authProvider) {
@@ -102,20 +114,14 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => {
102114

103115
if (logoutUser) {
104116
logout({}, redirectTo);
105-
} else {
106-
if (redirectTo.startsWith('http')) {
107-
// absolute link (e.g. https://my.oidc.server/login)
108-
window.location.href = redirectTo;
109-
} else {
110-
// internal location
111-
navigate(redirectTo);
112-
}
117+
} else if (redirectTo) {
118+
handleRedirect(redirectTo);
113119
}
114120

115121
return true;
116122
});
117123
},
118-
[authProvider, logout, notify, navigate]
124+
[authProvider, logout, notify, handleRedirect]
119125
);
120126
return logoutIfAccessDenied;
121127
};

0 commit comments

Comments
 (0)