All files / src/features/GiveOnboarding/pages/Bank/Connect useBankAccountConnect.ts

33.33% Statements 8/24
26.66% Branches 8/30
20% Functions 1/5
34.78% Lines 8/23

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                                  10x             10x 10x   10x               10x       10x                       10x                                                                                                 10x            
import { useRef } from "react";
import { AxiosError } from "axios";
import { showMessage } from "@common/Toast";
import { useBankAccountMutations } from "@hooks/onboarding/useAddOnboardingBankAccounts";
import {
  QKEY_GET_MERCHANT_BY_ID,
  QKEY_LIST_ALL_BANK_ACCOUNTS,
} from "@constants/queryKeys";
import { MERCHANT_SIDE_PANEL_PREVIEW_API_KEYS } from "@features/Merchants/MerchantSidePanel/constants";
import { useQueryClient } from "react-query";
import { isFunction } from "lodash";
import { isNormalizedInput } from "./utils";
import {
  BankAccountDetailsForm,
  IBusinessBankAccountConnectFormValues,
} from "@features/GiveOnboarding/types/form";
 
export const useBankAccountConnect = ({
  merchantId,
  firstAccount,
}: {
  merchantId: number;
  firstAccount?: BankAccountDetailsForm;
}) => {
  const queryClient = useQueryClient();
  const isForceError = useRef<boolean>(false);
 
  const defaultValues = {
    name: firstAccount?.name || "",
    type: firstAccount?.type?.toLowerCase() || "checking",
    routingNumber: firstAccount?.routingNumber || "",
    accountNumber: firstAccount?.accountNumber ?? "",
    notes: firstAccount?.notes || "",
  };
 
  const { create, update } = useBankAccountMutations(
    firstAccount?.bankDataAux.id,
  );
 
  const backLink = () => {
    queryClient.removeQueries(
      MERCHANT_SIDE_PANEL_PREVIEW_API_KEYS.GET_BANK_FILES,
    );
    queryClient.invalidateQueries(QKEY_LIST_ALL_BANK_ACCOUNTS);
    queryClient.invalidateQueries([QKEY_GET_MERCHANT_BY_ID, merchantId]);
    queryClient.invalidateQueries([
      MERCHANT_SIDE_PANEL_PREVIEW_API_KEYS.GET_BANK_ACCOUNTS,
      merchantId,
    ]);
  };
 
  const onSubmitInformation = async (
    data: { data: IBusinessBankAccountConnectFormValues; dirtyFields: any },
    onSuccess?: (data: any, apiData: any) => void,
    onError?: (error: any) => void,
  ) => {
    const bankData = data?.data;
 
    const customData = {
      routingNumber: bankData.routingNumber,
      ...(firstAccount?.bankDataAux.status !== "approved" && {
        name: bankData.name,
        type: bankData.type,
        ...(isNormalizedInput(bankData.accountNumber) && {
          number: bankData.accountNumber,
        }),
      }),
      notes: bankData.notes,
      status:
        firstAccount?.bankDataAux.status === "approved"
          ? "approved"
          : "pending_review",
      ...(firstAccount ? {} : { isDefault: true }),
    };
 
    if (isForceError.current) return;
 
    const mutation = firstAccount?.bankDataAux.id ? update : create;
    return (
      !isForceError.current &&
      mutation.mutate(
        { params: customData },
        {
          onSuccess: (apiData) => {
            backLink();
            isFunction(onSuccess) && onSuccess(data, apiData);
          },
          onError: (err: unknown) => {
            const axiosError = err as AxiosError;
            const errorMessage =
              (axiosError.response?.data as any)?.message ||
              "Whoops.. an error occured. Please try again";
            showMessage("Error", errorMessage);
            isFunction(onError) && onError(err);
          },
        },
      )
    );
  };
 
  return {
    onSubmitInformation,
    isForceError,
    defaultValues,
  };
};