(deps: UseLoginMutationDeps = {})
| 178 | * CHANGE: Now accepts optional dependencies for testing via dependency injection |
| 179 | */ |
| 180 | export function useLoginMutation(deps: UseLoginMutationDeps = {}) { |
| 181 | const queryClient = useQueryClient() |
| 182 | const { |
| 183 | saveUserCredentials = defaultSaveUserCredentials, |
| 184 | getUserInfoFromApiKey = defaultGetUserInfoFromApiKey, |
| 185 | logger = defaultLogger, |
| 186 | } = deps |
| 187 | |
| 188 | return useMutation({ |
| 189 | mutationFn: async (user: User) => { |
| 190 | // Save credentials to file system |
| 191 | saveUserCredentials(user) |
| 192 | |
| 193 | // Validate the new credentials |
| 194 | const authResult = await validateApiKey({ |
| 195 | apiKey: user.authToken, |
| 196 | getUserInfoFromApiKey, |
| 197 | logger, |
| 198 | }) |
| 199 | |
| 200 | const mergedUser = { ...user, ...authResult } |
| 201 | return mergedUser |
| 202 | }, |
| 203 | onSuccess: () => { |
| 204 | // Invalidate auth queries to trigger refetch with new credentials |
| 205 | queryClient.invalidateQueries({ queryKey: authQueryKeys.all }) |
| 206 | }, |
| 207 | onError: (error) => { |
| 208 | logger.error( |
| 209 | { |
| 210 | error: error instanceof Error ? error.message : String(error), |
| 211 | errorStack: error instanceof Error ? error.stack : undefined, |
| 212 | }, |
| 213 | '❌ Login mutation failed', |
| 214 | ) |
| 215 | }, |
| 216 | }) |
| 217 | } |
| 218 | |
| 219 | export interface UseLogoutMutationDeps { |
| 220 | logoutUser?: () => Promise<boolean> |
no test coverage detected