import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { apiClient, tokenManager } from '../api/client'; import { API_ENDPOINTS } from '../api/config'; import { useAuthStore } from '@/stores/authStore'; import { useRouter } from 'next/navigation'; interface LoginCredentials { email: string; password: string; } interface RegisterTenantData { email: string; password: string; fullName: string; tenantName: string; } export function useLogin() { const setUser = useAuthStore((state) => state.setUser); const router = useRouter(); return useMutation({ mutationFn: async (credentials: LoginCredentials) => { const { data } = await apiClient.post(API_ENDPOINTS.LOGIN, credentials); return data; }, onSuccess: (data) => { tokenManager.setAccessToken(data.accessToken); tokenManager.setRefreshToken(data.refreshToken); setUser({ id: data.user.id, email: data.user.email, fullName: data.user.fullName, tenantId: data.user.tenantId, tenantName: data.user.tenantName, role: data.user.role, isEmailVerified: data.user.isEmailVerified, }); router.push('/dashboard'); }, }); } export function useRegisterTenant() { const router = useRouter(); return useMutation({ mutationFn: async (data: RegisterTenantData) => { const response = await apiClient.post( API_ENDPOINTS.REGISTER_TENANT, data ); return response.data; }, onSuccess: () => { router.push('/login?registered=true'); }, }); } export function useLogout() { const clearUser = useAuthStore((state) => state.clearUser); const queryClient = useQueryClient(); const router = useRouter(); return useMutation({ mutationFn: async () => { try { await apiClient.post(API_ENDPOINTS.LOGOUT); } catch { // Ignore logout errors } }, onSuccess: () => { tokenManager.clearTokens(); clearUser(); queryClient.clear(); router.push('/login'); }, }); } export function useCurrentUser() { const setUser = useAuthStore((state) => state.setUser); const clearUser = useAuthStore((state) => state.clearUser); const setLoading = useAuthStore((state) => state.setLoading); return useQuery({ queryKey: ['currentUser'], queryFn: async () => { const { data } = await apiClient.get(API_ENDPOINTS.ME); setUser(data); setLoading(false); return data; }, enabled: !!tokenManager.getAccessToken(), retry: false, staleTime: 5 * 60 * 1000, // 5 minutes refetchOnWindowFocus: false, throwOnError: () => { clearUser(); tokenManager.clearTokens(); setLoading(false); return false; }, }); }