fix infinite redirect
This commit is contained in:
@@ -1,40 +1,40 @@
|
|||||||
import { Routes, Route, Navigate } from 'react-router-dom';
|
import { Routes, Route, Navigate } from "react-router-dom";
|
||||||
import { AuthProvider } from './contexts/AuthContext';
|
import { AuthProvider } from "./contexts/AuthContext";
|
||||||
import { TimerProvider } from './contexts/TimerContext';
|
import { TimerProvider } from "./contexts/TimerContext";
|
||||||
import { Layout } from './components/Layout';
|
import { Layout } from "./components/Layout";
|
||||||
import { ProtectedRoute } from './components/ProtectedRoute';
|
import { ProtectedRoute } from "./components/ProtectedRoute";
|
||||||
import { LoginPage } from './pages/LoginPage';
|
import { LoginPage } from "./pages/LoginPage";
|
||||||
import { AuthCallbackPage } from './pages/AuthCallbackPage';
|
import { AuthCallbackPage } from "./pages/AuthCallbackPage";
|
||||||
import { DashboardPage } from './pages/DashboardPage';
|
import { DashboardPage } from "./pages/DashboardPage";
|
||||||
import { TimeEntriesPage } from './pages/TimeEntriesPage';
|
import { TimeEntriesPage } from "./pages/TimeEntriesPage";
|
||||||
import { ClientsPage } from './pages/ClientsPage';
|
import { ClientsPage } from "./pages/ClientsPage";
|
||||||
import { ProjectsPage } from './pages/ProjectsPage';
|
import { ProjectsPage } from "./pages/ProjectsPage";
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<AuthProvider>
|
<AuthProvider>
|
||||||
<TimerProvider>
|
<Routes>
|
||||||
<Routes>
|
<Route path="/login" element={<LoginPage />} />
|
||||||
<Route path="/login" element={<LoginPage />} />
|
<Route path="/auth/callback" element={<AuthCallbackPage />} />
|
||||||
<Route path="/auth/callback" element={<AuthCallbackPage />} />
|
<Route
|
||||||
<Route
|
path="/"
|
||||||
path="/"
|
element={
|
||||||
element={
|
<ProtectedRoute>
|
||||||
<ProtectedRoute>
|
<TimerProvider>
|
||||||
<Layout />
|
<Layout />
|
||||||
</ProtectedRoute>
|
</TimerProvider>
|
||||||
}
|
</ProtectedRoute>
|
||||||
>
|
}
|
||||||
<Route index element={<Navigate to="/dashboard" replace />} />
|
>
|
||||||
<Route path="dashboard" element={<DashboardPage />} />
|
<Route index element={<Navigate to="/dashboard" replace />} />
|
||||||
<Route path="time-entries" element={<TimeEntriesPage />} />
|
<Route path="dashboard" element={<DashboardPage />} />
|
||||||
<Route path="clients" element={<ClientsPage />} />
|
<Route path="time-entries" element={<TimeEntriesPage />} />
|
||||||
<Route path="projects" element={<ProjectsPage />} />
|
<Route path="clients" element={<ClientsPage />} />
|
||||||
</Route>
|
<Route path="projects" element={<ProjectsPage />} />
|
||||||
</Routes>
|
</Route>
|
||||||
</TimerProvider>
|
</Routes>
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import axios, { AxiosError } from 'axios';
|
import axios, { AxiosError } from "axios";
|
||||||
|
|
||||||
const apiClient = axios.create({
|
const apiClient = axios.create({
|
||||||
baseURL: '/api',
|
baseURL: "/api",
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
"Content-Type": "application/json",
|
||||||
},
|
},
|
||||||
withCredentials: true,
|
withCredentials: true,
|
||||||
});
|
});
|
||||||
@@ -12,15 +12,12 @@ const apiClient = axios.create({
|
|||||||
apiClient.interceptors.response.use(
|
apiClient.interceptors.response.use(
|
||||||
(response) => response,
|
(response) => response,
|
||||||
(error: AxiosError<{ error?: string; details?: unknown }>) => {
|
(error: AxiosError<{ error?: string; details?: unknown }>) => {
|
||||||
if (error.response?.status === 401) {
|
// Let components handle authentication redirects via ProtectedRoute
|
||||||
// Redirect to login on 401
|
// Don't automatically redirect on 401 to avoid infinite loops
|
||||||
window.location.href = '/login';
|
const message =
|
||||||
return Promise.reject(error);
|
error.response?.data?.error || error.message || "An error occurred";
|
||||||
}
|
|
||||||
|
|
||||||
const message = error.response?.data?.error || error.message || 'An error occurred';
|
|
||||||
return Promise.reject(new Error(message));
|
return Promise.reject(new Error(message));
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export default apiClient;
|
export default apiClient;
|
||||||
|
|||||||
Reference in New Issue
Block a user