"use client"; import { FC, useState, useEffect } from "react"; import { useForm, useWatch } from "react-hook-form"; import { AddressDataTypes } from "@/types/types"; import { EMAIL, getLocalStorage } from "@/store/local-storage"; import { IS_VALID_ADDRESS, IS_VALID_PHONE, IS_VALID_INPUT } from "@/utils/constants"; import { isObject } from "@/utils/type-guards"; import { useCheckout } from "@utils/hooks/useCheckout"; import InputText from "@components/common/form/Input"; import { ProceedToCheckout } from "./ProceedToCheckout"; import CheckBox from "@components/theme/ui/element/Checkbox"; import { useDispatch } from "react-redux"; import { setCheckoutAddresses } from "@/store/slices/cart-slice"; export const GuestAddAdressForm: FC<{ billingAddress?: AddressDataTypes | null; shippingAddress?: AddressDataTypes | null; currentStep?: string; }> = ({ billingAddress: initialBilling, shippingAddress: initialShipping, currentStep, }) => { const email = getLocalStorage(EMAIL); const dispatch = useDispatch(); const [isOpen, setIsOpen] = useState(currentStep !== "address"); const [billingAddress, setBillingAddress] = useState( initialBilling ?? null ); const [shippingAddress, setShippingAddress] = useState(initialShipping ?? null); const [prevStep, setPrevStep] = useState(currentStep); if (currentStep !== prevStep) { setPrevStep(currentStep); setIsOpen(currentStep !== "address" && isObject(shippingAddress) && isObject(billingAddress)); } const { register, control, handleSubmit, reset, formState: { errors }, } = useForm({ mode: "onSubmit", defaultValues: { billing: { email: billingAddress?.email ?? email ?? "", firstName: billingAddress?.firstName || "", lastName: billingAddress?.lastName || "", companyName: billingAddress?.companyName || "", address: billingAddress?.address || "", country: billingAddress?.country || "IN", state: billingAddress?.state || "UP", city: billingAddress?.city || "", postcode: billingAddress?.postcode || "", phone: billingAddress?.phone || "", }, shipping: { email: shippingAddress?.email ?? email ?? "", firstName: shippingAddress?.firstName || "", lastName: shippingAddress?.lastName || "", companyName: shippingAddress?.companyName || "", address: shippingAddress?.address || "", country: shippingAddress?.country || "IN", state: shippingAddress?.state || "UP", city: shippingAddress?.city || "", postcode: shippingAddress?.postcode || "", phone: shippingAddress?.phone || "", }, useForShipping: true, }, }); useEffect(() => { if (initialBilling || initialShipping) { const billing = initialBilling ?? null; const shipping = initialShipping ?? null; requestAnimationFrame(() => { setBillingAddress(billing); setShippingAddress(shipping); setIsOpen(currentStep !== "address" && isObject(shipping) && isObject(billing)); }); reset({ billing: { email: initialBilling?.email ?? email ?? "", firstName: initialBilling?.firstName || "", lastName: initialBilling?.lastName || "", companyName: initialBilling?.companyName || "", address: initialBilling?.address || "", country: initialBilling?.country || "IN", state: initialBilling?.state || "UP", city: initialBilling?.city || "", postcode: initialBilling?.postcode || "", phone: initialBilling?.phone || "", }, shipping: { email: initialShipping?.email ?? email ?? "", firstName: initialShipping?.firstName || "", lastName: initialShipping?.lastName || "", companyName: initialShipping?.companyName || "", address: initialShipping?.address || "", country: initialShipping?.country || "IN", state: initialShipping?.state || "UP", city: initialShipping?.city || "", postcode: initialShipping?.postcode || "", phone: initialShipping?.phone || "", }, useForShipping: true, }); } }, [initialBilling, initialShipping, reset, email]); const { isLoadingToSave, saveCheckoutAddress } = useCheckout(); const watchUseForShipping = useWatch({ control, name: "useForShipping", defaultValue: true, }); const addGuestAddress = async (data: any) => { const billing = data?.billing; const shipping = data?.shipping; const useForShipping = Boolean(data.useForShipping); const shippingSource = useForShipping ? billing : shipping; const payload: any = { billingFirstName: billing.firstName, billingLastName: billing.lastName, billingEmail: billing.email ?? email ?? "", billingAddress: billing.address, billingCity: billing.city, billingCountry: billing.country || "IN", billingState: billing.state || "UP", billingPostcode: billing.postcode, billingPhoneNumber: billing.phone, billingCompanyName: billing.companyName, useForShipping, }; if (!useForShipping) { payload.shippingFirstName = shipping.firstName; payload.shippingLastName = shipping.lastName; payload.shippingEmail = shipping.email ?? email ?? ""; payload.shippingAddress = shipping.address; payload.shippingCity = shipping.city; payload.shippingCountry = shipping.country; payload.shippingState = shipping.state; payload.shippingPostcode = shipping.postcode; payload.shippingPhoneNumber = shipping.phone; payload.shippingCompanyName = shipping.companyName; } try { await saveCheckoutAddress(payload as any); dispatch( setCheckoutAddresses({ billing: { ...billing, email: billing.email ?? email ?? "", }, shipping: { ...shippingSource, email: shippingSource.email ?? email ?? "", }, }) ); setBillingAddress({ ...billing, email: billing.email ?? email ?? "", } as AddressDataTypes); setShippingAddress({ ...shippingSource, email: shippingSource.email ?? email ?? "", } as AddressDataTypes); setIsOpen(true); } catch (error) { console.error("Failed to save checkout address", error); } }; const showSummary = isObject(shippingAddress) && isObject(billingAddress); if (showSummary && isOpen) { return ( <>

Billing Address

{`${billingAddress?.firstName || ""} ${billingAddress?.lastName || "" }`}

{`${billingAddress?.companyName || ""}`}

{`${billingAddress?.address || ""}, ${billingAddress?.postcode || "" }`}

{billingAddress?.city || ""} {billingAddress?.state || ""}, {billingAddress?.country || ""}

{`T: ${billingAddress?.phone || ""}`}

Shipping Address

{`${shippingAddress?.firstName || ""} ${shippingAddress?.lastName || "" }`}

{`${shippingAddress?.companyName || ""}`}

{`${shippingAddress?.address || ""}, ${shippingAddress?.postcode || "" }`}

{shippingAddress?.city || ""} {shippingAddress?.state || ""}, {shippingAddress?.country || ""}

{`T: ${shippingAddress?.phone || ""}`}

Billing Address

{`${billingAddress?.firstName || ""} ${billingAddress?.lastName || "" }`}

{`${billingAddress?.companyName || ""}`}

{`${billingAddress?.address || ""}, ${billingAddress?.postcode || "" }`}

{billingAddress?.city || ""} {billingAddress?.state || ""}, {billingAddress?.country || ""}

{`T: ${billingAddress?.phone || ""}`}

Shipping Address

{`${shippingAddress?.firstName || ""} ${shippingAddress?.lastName || "" }`}

{`${shippingAddress?.companyName || ""}`}

{`${shippingAddress?.address || ""}, ${shippingAddress?.postcode || "" }`}

{shippingAddress?.city || ""} {shippingAddress?.state || ""}, {shippingAddress?.country || ""}

{`T: ${shippingAddress?.phone || ""}`}

); } return (
{!watchUseForShipping && (
)}
); };