fix: resolve 401 session refresh loop

Clear all auth state on 401, disable retries, and force logout on setup completion.

Resolves #2
This commit is contained in:
Fimeg
2025-10-31 12:29:15 -04:00
parent 3f9164c7ca
commit 7b7764115c
4 changed files with 18 additions and 7 deletions

View File

@@ -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);

View File

@@ -16,7 +16,11 @@ export const useAuthStore = create<AuthState>()(
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',

View File

@@ -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,
},
},
})

View File

@@ -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<string | null>(null);
const [envContent, setEnvContent] = useState<string | null>(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!');