All files / src/sections/PayBuilder/components/EmailPreview usePreviewCart.tsx

9.67% Statements 3/31
0% Branches 0/27
0% Functions 0/4
10% Lines 3/30

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                12x     12x                                                                                               12x                                                
import { ICartItem, useCart } from "@sections/PayBuilder/provider/CartContext";
 
import { getClosestRenewalDate } from "@sections/PayBuilder/components/InvoicePreview/utils";
import { parseAmount } from "@utils/index";
import { usePayBuilderForm } from "@sections/PayBuilder/provider/PayBuilderFormProvider";
import { checkPortals } from "@utils/routing";
import useCheckFormType from "../hooks/useCheckFormType";
 
const parseStringAmount = (value?: any) =>
  parseFloat((value || "").replace(/,/g, "")) || 0;
 
const useMockedCart = ({ onlyFirst = false }: { onlyFirst?: boolean } = {}) => {
  const { methods } = usePayBuilderForm();
  const values = methods.getValues();
 
  const { cartItems, subTotal, feesTotal } = values.Items.reduce<{
    cartItems: ICartItem[];
    subTotal: number;
    feesTotal: number;
  }>(
    (acc, item, index) => {
      if (!item.display) return acc;
 
      const unitPrice = parseStringAmount(item.amount);
      const signupFee = parseStringAmount(item.signupFee);
 
      const cartItem: ICartItem = {
        ...item,
        quantity: index === 0 ? 1 : onlyFirst ? 0 : 1,
        productVariantName: item.title,
        productVariantID: item.variantID || 0,
        productVariantPrice: unitPrice,
        unitPrice: unitPrice.toFixed(2),
        productVariantImageURL: item.thumbnail || "",
        recurringIntervalName: item.paymentType,
      };
 
      acc.cartItems.push(cartItem);
 
      if (cartItem.quantity > 0) {
        acc.subTotal += unitPrice;
        acc.feesTotal += signupFee;
      }
 
      return acc;
    },
    { cartItems: [], subTotal: 0, feesTotal: 0 },
  );
 
  const parsedSubTotal = parseAmount(subTotal);
  const parsedFeesTotal = parseAmount(feesTotal);
 
  return {
    cartItems,
    subTotal: parsedSubTotal,
    feesTotal: parsedFeesTotal,
  };
};
 
const usePreviewCart = (mockProps: { onlyFirst?: boolean } = {}) => {
  const { data } = usePayBuilderForm();
 
  const { isPayBuilder } = checkPortals();
  const { isMembership } = useCheckFormType();
 
  const mockedCart = useMockedCart(mockProps);
  const realCart = useCart();
 
  const cart = isPayBuilder && !isMembership ? realCart : mockedCart;
  const cartItems = cart.cartItems;
 
  const invoiceDate = data?.createdAt * 1000 || new Date();
  const renewalDate = getClosestRenewalDate(cartItems, invoiceDate);
  const feesTotal = (cart as any).feesTotal ?? "0.00";
 
  return {
    ...cart,
    feesTotal,
    renewalDate,
  };
};
 
export default usePreviewCart;