diff --git a/aggregator-web/src/lib/api.ts b/aggregator-web/src/lib/api.ts index 4cba513..00c834d 100644 --- a/aggregator-web/src/lib/api.ts +++ b/aggregator-web/src/lib/api.ts @@ -48,10 +48,12 @@ api.interceptors.request.use((config) => { // Response interceptor to handle errors api.interceptors.response.use( (response: AxiosResponse) => response, - (error) => { + async (error) => { if (error.response?.status === 401) { - // Clear token and redirect to login + const { useAuthStore } = await import('./store'); + useAuthStore.getState().logout(); localStorage.removeItem('auth_token'); + localStorage.removeItem('user'); window.location.href = '/login'; } return Promise.reject(error); diff --git a/aggregator-web/src/lib/store.ts b/aggregator-web/src/lib/store.ts index 461f8fa..c4be79a 100644 --- a/aggregator-web/src/lib/store.ts +++ b/aggregator-web/src/lib/store.ts @@ -16,7 +16,11 @@ export const useAuthStore = create()( token: null, isAuthenticated: false, setToken: (token) => set({ token, isAuthenticated: true }), - logout: () => set({ token: null, isAuthenticated: false }), + logout: () => { + localStorage.removeItem('auth_token'); + localStorage.removeItem('user'); + set({ token: null, isAuthenticated: false }); + }, }), { name: 'auth-storage', diff --git a/aggregator-web/src/main.tsx b/aggregator-web/src/main.tsx index 936d0d3..da52086 100644 --- a/aggregator-web/src/main.tsx +++ b/aggregator-web/src/main.tsx @@ -9,9 +9,12 @@ import './index.css' const queryClient = new QueryClient({ defaultOptions: { queries: { - retry: 2, - staleTime: 0, // Data is always stale to allow real-time updates - refetchOnWindowFocus: false, // Don't refetch on window focus to avoid unnecessary requests + retry: (failureCount, error: any) => { + if (error?.response?.status === 401) return false; + return failureCount < 2; + }, + staleTime: 0, + refetchOnWindowFocus: false, }, }, }) diff --git a/aggregator-web/src/pages/Setup.tsx b/aggregator-web/src/pages/Setup.tsx index 307c07a..32156ba 100644 --- a/aggregator-web/src/pages/Setup.tsx +++ b/aggregator-web/src/pages/Setup.tsx @@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { Settings, Database, User, Shield, Eye, EyeOff, CheckCircle } from 'lucide-react'; import { toast } from 'react-hot-toast'; import { setupApi } from '@/lib/api'; +import { useAuthStore } from '@/lib/store'; interface SetupFormData { adminUser: string; @@ -19,6 +20,7 @@ interface SetupFormData { const Setup: React.FC = () => { const navigate = useNavigate(); + const { logout } = useAuthStore(); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [envContent, setEnvContent] = useState(null); @@ -106,12 +108,12 @@ const Setup: React.FC = () => { return; } + logout(); setIsLoading(true); try { const result = await setupApi.configure(formData); - // Store env content and show success screen setEnvContent(result.envContent || null); setShowSuccess(true); toast.success(result.message || 'Configuration saved successfully!');