import { useState, useEffect } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { apiRequest } from "@/lib/queryClient"; import type { User, LoginData } from "@shared/schema"; export function useAuth() { const queryClient = useQueryClient(); const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const checkAuth = async () => { try { const response = await fetch('/api/auth/me', { credentials: 'include', }); if (response.ok) { const userData = await response.json(); setUser(userData); } else { setUser(null); } } catch (error) { setUser(null); } finally { setIsLoading(false); } }; checkAuth(); }, []); const loginMutation = useMutation({ mutationFn: async (credentials: LoginData) => { const response = await apiRequest('/api/auth/login', { method: 'POST', body: JSON.stringify(credentials) }); const data = await response.json(); return data; }, onSuccess: (data) => { setUser(data.user); queryClient.clear(); // Force a page reload to ensure proper state update window.location.reload(); }, }); const logoutMutation = useMutation({ mutationFn: async () => { await apiRequest('/api/auth/logout', { method: 'POST' }); }, onSuccess: () => { setUser(null); queryClient.clear(); // Force a page reload to ensure all state is cleared window.location.reload(); }, }); return { user, isLoading, isAuthenticated: !!user, login: loginMutation.mutateAsync, logout: logoutMutation.mutateAsync, isLoggingIn: loginMutation.isPending, isLoggingOut: logoutMutation.isPending, }; }