Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions apps/frontend/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,19 @@ import AdminRoutes from '@features/auth/components/AdminRoutes';
import HomePage from '@shared/pages/HomePage';

export const App: React.FC = () => {
const [token, setToken] = useState<string>('');
const [token, setToken] = useState<string>(() => {
const storedToken = localStorage.getItem('token');
return storedToken ? JSON.parse(storedToken) : '';
});

return (
<LoginContext.Provider value={{ setToken, token }}>
<BrowserRouter>
<Routes>
<Route path="/login" element={<LoginPage />} />
<Route path="/home" element={<HomePage />} />

<Route element={<ProtectedRoutes token={token} />}>
<Route element={<ProtectedRoutes />}>
<Route element={<AdminRoutes />}>
<Route path="/" element={<ApplicationsPage />} />
<Route path="/applications" element={<ApplicationsPage />} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,23 @@ export default function LoginPage() {
);

// Keep backward compatibility - store access token for existing code
sessionStorage.setItem(
localStorage.setItem(
'token',
JSON.stringify(tokenResponse.access_token),
);

setToken(tokenResponse.access_token);

// Redirect to dashboard after successful login
navigate('/');
navigate('/', { replace: true });
} catch (error) {
console.error('Error fetching token:', error);
// Redirect to home page on error
navigate('/home');
navigate('/home', { replace: true });
}
} else {
// No auth code - redirect to home page
navigate('/home');
navigate('/home', { replace: true });
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { Navigate, Outlet } from 'react-router-dom';
import useLoginContext from '@features/auth/components/LoginPage/useLoginContext';

/**
* ProtectedRoutes renders the children components only
* if the user is authenticated (i.e if an access token exists).
* If the user is not authenticated, it redirects to the login page.
*/
function ProtectedRoutes({ token }: { token: string }) {
return token ? <Outlet /> : <Navigate to="/login" />;
function ProtectedRoutes() {
const { token } = useLoginContext();
return token ? <Outlet /> : <Navigate to="/home" replace />;
}

export default ProtectedRoutes;
12 changes: 6 additions & 6 deletions apps/frontend/src/shared/hooks/useAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const verifier = CognitoJwtVerifier.create({
/**
* Custom hook to manage authentication state
*
* Checks if user has a valid token in sessionStorage and verifies it.
* Checks if user has a valid token in localStorage and verifies it.
* Returns authentication state and sign out handler.
*/
export const useAuth = () => {
Expand All @@ -21,17 +21,17 @@ export const useAuth = () => {

useEffect(() => {
const checkAuth = async () => {
const sessionToken = sessionStorage.getItem('token');
const localToken = localStorage.getItem('token');

if (sessionToken) {
if (localToken) {
try {
const token = JSON.parse(sessionToken);
const token = JSON.parse(localToken);
await verifier.verify(token);
setToken(token);
setIsAuthenticated(true);
} catch (error) {
console.log('Error verifying token:', error);
sessionStorage.removeItem('token');
localStorage.removeItem('token');
setIsAuthenticated(false);
}
} else {
Expand All @@ -45,7 +45,7 @@ export const useAuth = () => {
}, [setToken]);

const signOut = () => {
sessionStorage.removeItem('token');
localStorage.removeItem('token');
localStorage.removeItem('auth_tokens');
setToken('');
setIsAuthenticated(false);
Expand Down
Loading
Loading