From d200254783e7be83fbaba8fe539fff8ee8299c29 Mon Sep 17 00:00:00 2001 From: "simon.franken" Date: Mon, 16 Feb 2026 15:41:59 +0100 Subject: [PATCH] fix infinite redirect --- frontend/src/App.tsx | 62 +++++++++++++++++++------------------- frontend/src/api/client.ts | 21 ++++++------- 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 03a5e21..dff8f41 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,40 +1,40 @@ -import { Routes, Route, Navigate } from 'react-router-dom'; -import { AuthProvider } from './contexts/AuthContext'; -import { TimerProvider } from './contexts/TimerContext'; -import { Layout } from './components/Layout'; -import { ProtectedRoute } from './components/ProtectedRoute'; -import { LoginPage } from './pages/LoginPage'; -import { AuthCallbackPage } from './pages/AuthCallbackPage'; -import { DashboardPage } from './pages/DashboardPage'; -import { TimeEntriesPage } from './pages/TimeEntriesPage'; -import { ClientsPage } from './pages/ClientsPage'; -import { ProjectsPage } from './pages/ProjectsPage'; +import { Routes, Route, Navigate } from "react-router-dom"; +import { AuthProvider } from "./contexts/AuthContext"; +import { TimerProvider } from "./contexts/TimerContext"; +import { Layout } from "./components/Layout"; +import { ProtectedRoute } from "./components/ProtectedRoute"; +import { LoginPage } from "./pages/LoginPage"; +import { AuthCallbackPage } from "./pages/AuthCallbackPage"; +import { DashboardPage } from "./pages/DashboardPage"; +import { TimeEntriesPage } from "./pages/TimeEntriesPage"; +import { ClientsPage } from "./pages/ClientsPage"; +import { ProjectsPage } from "./pages/ProjectsPage"; function App() { return ( - - - } /> - } /> - + + } /> + } /> + + - - } - > - } /> - } /> - } /> - } /> - } /> - - - + + + } + > + } /> + } /> + } /> + } /> + } /> + + ); } -export default App; \ No newline at end of file +export default App; diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index a79a508..f42e0d5 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -1,9 +1,9 @@ -import axios, { AxiosError } from 'axios'; +import axios, { AxiosError } from "axios"; const apiClient = axios.create({ - baseURL: '/api', + baseURL: "/api", headers: { - 'Content-Type': 'application/json', + "Content-Type": "application/json", }, withCredentials: true, }); @@ -12,15 +12,12 @@ const apiClient = axios.create({ apiClient.interceptors.response.use( (response) => response, (error: AxiosError<{ error?: string; details?: unknown }>) => { - if (error.response?.status === 401) { - // Redirect to login on 401 - window.location.href = '/login'; - return Promise.reject(error); - } - - const message = error.response?.data?.error || error.message || 'An error occurred'; + // Let components handle authentication redirects via ProtectedRoute + // Don't automatically redirect on 401 to avoid infinite loops + const message = + error.response?.data?.error || error.message || "An error occurred"; return Promise.reject(new Error(message)); - } + }, ); -export default apiClient; \ No newline at end of file +export default apiClient;