merge: bring in session-loop and dashboard fixes from main
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
@@ -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!');
|
||||
|
||||
Reference in New Issue
Block a user