import { useCallback, useState } from 'react';
import axios from 'axios';
import type { Cart, UpdateCartInfoRequest } from '@broadleaf/commerce-cart';
import type { ApiError } from '@broadleaf/commerce-core';
import { usePreviewOptions } from '@broadleaf/commerce-shared-react';
import { useGetCustomerAccessToken } from '@src/auth/hooks';
import { useCartClient } from '@src/common/contexts';
interface Response {
updateCartInfo: (cart: Cart, request: UpdateCartInfoRequest) => Promise<void>;
cart?: Cart;
error?: ApiError | unknown;
}
export const useUpdateCartInfo = (): Response => {
const [error, setError] = useState<ApiError | unknown>();
const [cart, setCart] = useState<Cart>();
const getCustomerToken = useGetCustomerAccessToken();
const preview = usePreviewOptions(); // <-- use the hook
const cartClient = useCartClient();
const updateCartInfo = useCallback(
async (cart: Cart, request: UpdateCartInfoRequest): Promise<void> => {
try {
setError(undefined);
const accessToken = await getCustomerToken();
const newCart = await cartClient.updateCartInfo(cart.id, request, {
accessToken,
preview, // <-- use the preview options //
version: cart.version,
});
setCart(newCart);
} catch (err) {
if (axios.isCancel(err)) {
return;
}
if (axios.isAxiosError(err)) {
setError(err.response.data);
}
setError(err);
}
},
[cartClient, getCustomerToken, preview]
);
return { updateCartInfo, error, cart };
};