All files / src/hooks/mutations useAuthMutations.ts

88.88% Statements 24/27
66.66% Branches 12/18
75% Functions 9/12
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114                                        2x 84x                   5x   3x 1x     1x     2x     2x                           2x 84x                   6x   4x 1x     1x     3x     2x                           2x 84x   5x   3x 1x     1x     2x     2x        
// src/hooks/mutations/useAuthMutations.ts
import { useMutation } from '@tanstack/react-query';
import * as apiClient from '../../services/apiClient';
import { notifyError } from '../../services/notificationService';
import type { UserProfile } from '../../types';
 
interface AuthResponse {
  userprofile: UserProfile;
  token: string;
}
 
/**
 * Mutation hook for user login.
 *
 * @example
 * ```tsx
 * const loginMutation = useLoginMutation();
 * loginMutation.mutate({ email, password, rememberMe });
 * ```
 */
export const useLoginMutation = () => {
  return useMutation({
    mutationFn: async ({
      email,
      password,
      rememberMe,
    }: {
      email: string;
      password: string;
      rememberMe: boolean;
    }): Promise<AuthResponse> => {
      const response = await apiClient.loginUser(email, password, rememberMe);
 
      if (!response.ok) {
        const error = await response.json().catch(() => ({
          message: `Request failed with status ${response.status}`,
        }));
        throw new Error(error.message || 'Failed to login');
      }
 
      return response.json();
    },
    onError: (error: Error) => {
      notifyError(error.message || 'Failed to login');
    },
  });
};
 
/**
 * Mutation hook for user registration.
 *
 * @example
 * ```tsx
 * const registerMutation = useRegisterMutation();
 * registerMutation.mutate({ email, password, fullName });
 * ```
 */
export const useRegisterMutation = () => {
  return useMutation({
    mutationFn: async ({
      email,
      password,
      fullName,
    }: {
      email: string;
      password: string;
      fullName: string;
    }): Promise<AuthResponse> => {
      const response = await apiClient.registerUser(email, password, fullName, '');
 
      if (!response.ok) {
        const error = await response.json().catch(() => ({
          message: `Request failed with status ${response.status}`,
        }));
        throw new Error(error.message || 'Failed to register');
      }
 
      return response.json();
    },
    onError: (error: Error) => {
      notifyError(error.message || 'Failed to register');
    },
  });
};
 
/**
 * Mutation hook for requesting a password reset.
 *
 * @example
 * ```tsx
 * const passwordResetMutation = usePasswordResetRequestMutation();
 * passwordResetMutation.mutate({ email });
 * ```
 */
export const usePasswordResetRequestMutation = () => {
  return useMutation({
    mutationFn: async ({ email }: { email: string }): Promise<{ message: string }> => {
      const response = await apiClient.requestPasswordReset(email);
 
      if (!response.ok) {
        const error = await response.json().catch(() => ({
          message: `Request failed with status ${response.status}`,
        }));
        throw new Error(error.message || 'Failed to request password reset');
      }
 
      return response.json();
    },
    onError: (error: Error) => {
      notifyError(error.message || 'Failed to request password reset');
    },
  });
};