[#418] improved retry logic to prevent loading loop (#427)

* [#418] improved retry logic to prevent loading loop

* [#418] added FullJitter algorithm

Co-authored-by: Benoit TELLIER <btellier@linagora.com>
This commit is contained in:
Camille Moussu
2025-12-19 12:24:34 +01:00
committed by GitHub
parent 90d6058b0f
commit 6839353f34
5 changed files with 70 additions and 9 deletions
+13 -2
View File
@@ -59,10 +59,21 @@ export function HandleLogin() {
if (userData.error) {
dispatch(push("/error"));
}
if (!calendars.pending && !userData.loading && !userData.error) {
if (
!calendars.pending &&
!userData.loading &&
!userData.error &&
!calendars.error
) {
dispatch(push("/calendar"));
}
}, [calendars.pending, userData.loading, userData.error, dispatch]);
}, [
calendars.pending,
userData.loading,
userData.error,
calendars.error,
dispatch,
]);
return <Loading />;
}
+15 -2
View File
@@ -1,8 +1,13 @@
import { useEffect, useRef } from "react";
import { Callback } from "./oidcAuth";
import { useAppDispatch, useAppSelector } from "../../app/hooks";
import { useAppDispatch } from "../../app/hooks";
import { push } from "redux-first-history";
import { getOpenPaasUserDataAsync, setTokens, setUserData } from "./userSlice";
import {
getOpenPaasUserDataAsync,
setTokens,
setUserData,
setUserError,
} from "./userSlice";
import { Loading } from "../../components/Loading/Loading";
import { getCalendarsListAsync } from "../Calendars/CalendarSlice";
@@ -21,6 +26,9 @@ export function CallbackResume() {
const runCallback = async () => {
try {
const data = await Callback(saved?.code_verifier, saved?.state);
if (!data || !data.userinfo || !data.tokenSet) {
throw new Error("OAuth callback failed");
}
dispatch(setUserData(data?.userinfo));
dispatch(setTokens(data?.tokenSet));
await dispatch(getOpenPaasUserDataAsync());
@@ -37,6 +45,11 @@ export function CallbackResume() {
dispatch(push("/"));
} catch (e) {
console.error("OIDC callback error:", e);
// Redirect to error page after error
dispatch(
setUserError(e instanceof Error ? e.message : "OAuth callback failed")
);
dispatch(push("/error"));
}
};
+4
View File
@@ -86,6 +86,9 @@ export const userSlice = createSlice({
setAlarmEmails: (state, action) => {
state.alarmEmailsEnabled = action.payload;
},
setUserError: (state, action) => {
state.error = action.payload;
},
clearError: (state) => {
state.error = null;
},
@@ -218,6 +221,7 @@ export const {
setLanguage,
setTimezone,
setAlarmEmails,
setUserError,
clearError,
} = userSlice.actions;