From 5a0f31777a7df9d2b050026cc540396c4460f31d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?An=C3=ADbal=20Svarcas?= <WiXSL@users.noreply.github.com>
Date: Thu, 30 Dec 2021 09:13:13 -0300
Subject: [PATCH 1/3] Fix loading indicator not updated on permissions error
 when logoutUser is false

---
 packages/ra-core/src/auth/useLogoutIfAccessDenied.ts | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts b/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts
index 5e9429dcae6..100ab650823 100644
--- a/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts
+++ b/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts
@@ -4,6 +4,8 @@ import useAuthProvider from './useAuthProvider';
 import useLogout from './useLogout';
 import { useNotify } from '../sideEffect';
 import { useHistory } from 'react-router';
+import { fetchEnd } from '../actions';
+import { useDispatch } from 'react-redux';
 
 let timer;
 
@@ -43,6 +45,8 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => {
     const logout = useLogout();
     const notify = useNotify();
     const history = useHistory();
+    const dispatch = useDispatch();
+
     const logoutIfAccessDenied = useCallback(
         (error?: any, disableNotification?: boolean) =>
             authProvider
@@ -92,12 +96,13 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => {
                     if (logoutUser) {
                         logout({}, redirectTo);
                     } else {
+                        dispatch(fetchEnd());
                         history.push(redirectTo);
                     }
 
                     return true;
                 }),
-        [authProvider, logout, notify, history]
+        [authProvider, logout, notify, history, dispatch]
     );
     return authProvider
         ? logoutIfAccessDenied

From d6bc43b2ba4fee4b644ad746b8e62ecb9bb40812 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?An=C3=ADbal=20Svarcas?= <WiXSL@users.noreply.github.com>
Date: Thu, 30 Dec 2021 10:12:57 -0300
Subject: [PATCH 2/3] Fix tests

---
 packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx b/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx
index 9a04b224db0..335466d1531 100644
--- a/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx
+++ b/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx
@@ -1,7 +1,7 @@
 import * as React from 'react';
 import { useState, useEffect } from 'react';
 import expect from 'expect';
-import { render, waitFor } from '@testing-library/react';
+import { waitFor } from '@testing-library/react';
 import { Router } from 'react-router-dom';
 import { createMemoryHistory } from 'history';
 
@@ -10,6 +10,7 @@ import AuthContext from './AuthContext';
 import useLogout from './useLogout';
 import useNotify from '../sideEffect/useNotify';
 import { AuthProvider } from '../types';
+import { renderWithRedux } from 'ra-test';
 
 let loggedIn = true;
 
@@ -62,7 +63,7 @@ useNotify.mockImplementation(() => notify);
 
 function renderInRouter(children) {
     const history = createMemoryHistory();
-    const api = render(<Router history={history}>{children}</Router>);
+    const api = renderWithRedux(<Router history={history}>{children}</Router>);
 
     return {
         ...api,

From 2b18d0862f22cbdb14044286918118fbb5a898f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?An=C3=ADbal=20Svarcas?= <WiXSL@users.noreply.github.com>
Date: Mon, 3 Jan 2022 10:18:46 -0300
Subject: [PATCH 3/3] Improve fix

---
 packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx  | 5 ++---
 packages/ra-core/src/auth/useLogoutIfAccessDenied.ts        | 6 +-----
 .../src/dataProvider/performQuery/performOptimisticQuery.ts | 5 ++++-
 .../dataProvider/performQuery/performPessimisticQuery.ts    | 5 ++++-
 .../src/dataProvider/performQuery/performUndoableQuery.ts   | 5 ++++-
 5 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx b/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx
index 335466d1531..9a04b224db0 100644
--- a/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx
+++ b/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx
@@ -1,7 +1,7 @@
 import * as React from 'react';
 import { useState, useEffect } from 'react';
 import expect from 'expect';
-import { waitFor } from '@testing-library/react';
+import { render, waitFor } from '@testing-library/react';
 import { Router } from 'react-router-dom';
 import { createMemoryHistory } from 'history';
 
@@ -10,7 +10,6 @@ import AuthContext from './AuthContext';
 import useLogout from './useLogout';
 import useNotify from '../sideEffect/useNotify';
 import { AuthProvider } from '../types';
-import { renderWithRedux } from 'ra-test';
 
 let loggedIn = true;
 
@@ -63,7 +62,7 @@ useNotify.mockImplementation(() => notify);
 
 function renderInRouter(children) {
     const history = createMemoryHistory();
-    const api = renderWithRedux(<Router history={history}>{children}</Router>);
+    const api = render(<Router history={history}>{children}</Router>);
 
     return {
         ...api,
diff --git a/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts b/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts
index 100ab650823..d49e4ab4280 100644
--- a/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts
+++ b/packages/ra-core/src/auth/useLogoutIfAccessDenied.ts
@@ -4,8 +4,6 @@ import useAuthProvider from './useAuthProvider';
 import useLogout from './useLogout';
 import { useNotify } from '../sideEffect';
 import { useHistory } from 'react-router';
-import { fetchEnd } from '../actions';
-import { useDispatch } from 'react-redux';
 
 let timer;
 
@@ -45,7 +43,6 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => {
     const logout = useLogout();
     const notify = useNotify();
     const history = useHistory();
-    const dispatch = useDispatch();
 
     const logoutIfAccessDenied = useCallback(
         (error?: any, disableNotification?: boolean) =>
@@ -96,13 +93,12 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => {
                     if (logoutUser) {
                         logout({}, redirectTo);
                     } else {
-                        dispatch(fetchEnd());
                         history.push(redirectTo);
                     }
 
                     return true;
                 }),
-        [authProvider, logout, notify, history, dispatch]
+        [authProvider, logout, notify, history]
     );
     return authProvider
         ? logoutIfAccessDenied
diff --git a/packages/ra-core/src/dataProvider/performQuery/performOptimisticQuery.ts b/packages/ra-core/src/dataProvider/performQuery/performOptimisticQuery.ts
index e016658de3b..c462c3bd0b9 100644
--- a/packages/ra-core/src/dataProvider/performQuery/performOptimisticQuery.ts
+++ b/packages/ra-core/src/dataProvider/performQuery/performOptimisticQuery.ts
@@ -89,7 +89,10 @@ export const performOptimisticQuery = ({
                         console.error(error);
                     }
                     return logoutIfAccessDenied(error).then(loggedOut => {
-                        if (loggedOut) return;
+                        if (loggedOut) {
+                            dispatch({ type: FETCH_END });
+                            return;
+                        }
                         dispatch({
                             type: `${action}_FAILURE`,
                             error: error.message ? error.message : error,
diff --git a/packages/ra-core/src/dataProvider/performQuery/performPessimisticQuery.ts b/packages/ra-core/src/dataProvider/performQuery/performPessimisticQuery.ts
index 9daeec1b245..214c4e34cc4 100644
--- a/packages/ra-core/src/dataProvider/performQuery/performPessimisticQuery.ts
+++ b/packages/ra-core/src/dataProvider/performQuery/performPessimisticQuery.ts
@@ -71,7 +71,10 @@ export const performPessimisticQuery = ({
                     console.error(error);
                 }
                 return logoutIfAccessDenied(error).then(loggedOut => {
-                    if (loggedOut) return;
+                    if (loggedOut) {
+                        dispatch({ type: FETCH_END });
+                        return;
+                    }
                     dispatch({
                         type: `${action}_FAILURE`,
                         error: error.message ? error.message : error,
diff --git a/packages/ra-core/src/dataProvider/performQuery/performUndoableQuery.ts b/packages/ra-core/src/dataProvider/performQuery/performUndoableQuery.ts
index 8716f80d64f..fae1f64dc3c 100644
--- a/packages/ra-core/src/dataProvider/performQuery/performUndoableQuery.ts
+++ b/packages/ra-core/src/dataProvider/performQuery/performUndoableQuery.ts
@@ -129,7 +129,10 @@ export const performUndoableQuery = ({
                         console.error(error);
                     }
                     return logoutIfAccessDenied(error).then(loggedOut => {
-                        if (loggedOut) return;
+                        if (loggedOut) {
+                            dispatch({ type: FETCH_END });
+                            return;
+                        }
                         dispatch({
                             type: `${action}_FAILURE`,
                             error: error.message ? error.message : error,