Skip to content

Commit

Permalink
fix redirect
Browse files Browse the repository at this point in the history
  • Loading branch information
Codebmk committed Feb 25, 2025
1 parent 46ca899 commit 26d1057
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 31 deletions.
79 changes: 50 additions & 29 deletions src/platform/src/core/utils/protectedRoute.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/router';
import { useSelector, useDispatch } from 'react-redux';
import LogoutUser from '@/core/utils/LogoutUser';
import Cookies from 'js-cookie';
import jwt_decode from 'jwt-decode';
import {
setUserInfo,
setSuccess,
resetStore,
} from '@/lib/store/services/account/LoginSlice';
import { getIndividualUserPreferences } from '@/lib/store/services/account/UserDefaultsSlice';
import { getUserDetails } from '@/core/apis/Account';
Expand All @@ -21,10 +21,11 @@ export default function withAuth(Component) {
const dispatch = useDispatch();
const router = useRouter();
const userCredentials = useSelector((state) => state.login);
const [isRedirecting, setIsRedirecting] = React.useState(
const [isRedirecting, setIsRedirecting] = useState(
router.query.success === 'google',
);
const [redirectToLogin, setRedirectToLogin] = React.useState(false);
const [redirectToLogin, setRedirectToLogin] = useState(false);
const [isMounted, setIsMounted] = useState(false);

const retryWithDelay = async (fn, retries = MAX_RETRIES) => {
try {
Expand Down Expand Up @@ -60,58 +61,78 @@ export default function withAuth(Component) {

dispatch(setUserInfo(user));
dispatch(setSuccess(true));
setIsRedirecting(false);
setIsRedirecting(false); // Clear redirecting state after success
};

useEffect(() => {
if (typeof window !== 'undefined') {
// Handle Google redirect first
// Mark as mounted only once
if (!isMounted) {
setIsMounted(true);
}

if (typeof window === 'undefined') return;

const handleAuth = async () => {
// Handle Google redirect
if (router.query.success === 'google') {
const token = Cookies.get('access_token');
if (token) {
try {
const token = Cookies.get('temp_access_token');
if (!token) {
throw new Error('No access_token cookie found');
}

localStorage.setItem('token', token);
const decoded = jwt_decode(token);
retryWithDelay(() => getUserDetails(decoded._id, token))
.then((response) => setupUserSession(response.users[0]))
.catch((error) => {
console.error('Google auth error:', error);
setIsRedirecting(false);
setRedirectToLogin(true);
})
.finally(() => {
if (!userCredentials.success) setRedirectToLogin(true);
});
} else {
const response = await retryWithDelay(() =>
getUserDetails(decoded._id, token),
);
await setupUserSession(response.users[0]);
} catch (error) {
console.error('Google auth error:', error);
setIsRedirecting(false);
setRedirectToLogin(true);
}
return; // Exit early to prevent further checks until redirect is resolved
return;
}

// Handle authentication checks
const storedUserGroup = localStorage.getItem('activeGroup');
if (!userCredentials.success) {
setRedirectToLogin(true);
return;
}

if (!storedUserGroup) {
LogoutUser(dispatch, router);
dispatch(resetStore());
if (typeof window !== 'undefined') {
localStorage.clear();
}
const store = router.store || window.__NEXT_REDUX_STORE__;
if (store?.__persistor) {
await store.__persistor.purge();
}
setRedirectToLogin(true);
}
}
}, [userCredentials, dispatch, router, retryWithDelay, isRedirecting]);
};

handleAuth();
}, [
userCredentials.success,
dispatch,
router.query.success,
retryWithDelay,
]);

// Handle deferred redirect to /account/login
useEffect(() => {
if (redirectToLogin) {
if (isMounted && redirectToLogin) {
router.push(LOGIN_ROUTE);
}
}, [redirectToLogin, router]);
}, [isMounted, redirectToLogin, router]);

// Block rendering until redirect is handled
if (isRedirecting) {
return <Spinner width={20} height={20} />;
}

// Render the component if the user is authenticated
return userCredentials.success ? <Component {...props} /> : null;
};
}
Expand Down
4 changes: 2 additions & 2 deletions src/platform/src/pages/Home/index.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Import statements
import dynamic from 'next/dynamic';
import withAuth from '@/core/utils/protectedRoute';
import React, { useState, useEffect, useCallback, useMemo } from 'react';
import Layout from '@/components/Layout';
Expand Down Expand Up @@ -302,4 +302,4 @@ const Home = () => {
);
};

export default withAuth(Home);
export default dynamic(() => Promise.resolve(withAuth(Home)), { ssr: false });

0 comments on commit 26d1057

Please sign in to comment.