'use client'; import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'; import { ShoppingCartIcon } from '@heroicons/react/24/outline'; import { zodResolver } from '@hookform/resolvers/zod'; import clsx from 'clsx'; import LoadingDots from 'components/loading-dots'; import Price from 'components/price'; import useAuth from 'hooks/use-auth'; import type { Cart } from 'lib/shopify/types'; import { Fragment, useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; import { setMetafields } from './actions'; import CloseCart from './close-cart'; import LineItem from './line-item'; import OpenCart from './open-cart'; import VehicleDetails, { VehicleFormSchema, vehicleFormSchema } from './vehicle-details'; const getCheckoutUrlWithAuthentication = (url: string) => { const checkoutUrl = new URL(url); checkoutUrl.searchParams.append('logged_in', 'true'); return checkoutUrl.toString(); }; export default function CartModal({ cart }: { cart: Cart | undefined }) { const { isAuthenticated } = useAuth(); const [isOpen, setIsOpen] = useState(false); const quantityRef = useRef(cart?.totalQuantity); const openCart = () => setIsOpen(true); const closeCart = () => setIsOpen(false); const { control, handleSubmit } = useForm({ resolver: zodResolver(vehicleFormSchema), defaultValues: { customer_vin: cart?.attributes.find((a) => a.key === 'customer_vin')?.value || '', customer_mileage: cart?.attributes.find((a) => a.key === 'customer_mileage')?.value || '' } }); const [loading, setLoading] = useState(false); const [message, setMessage] = useState(); const linkRef = useRef(null); useEffect(() => { // Open cart modal when quantity changes. if (cart?.totalQuantity !== quantityRef.current) { // But only if it's not already open (quantity also changes when editing items in cart). if (!isOpen) { setIsOpen(true); } // Always update the quantity reference quantityRef.current = cart?.totalQuantity; } }, [isOpen, cart?.totalQuantity, quantityRef]); const onSubmit = async (data: VehicleFormSchema) => { if (!cart) return; setLoading(true); try { const message = await setMetafields(cart.id, data); if (message) { setMessage(message); } else { linkRef.current?.click(); } } catch (error) { setMessage('Error updating vehicle details'); } finally { setLoading(false); } }; return ( <> ); }