import { Button } from '@components/common/ui/Button.js'; import { Item, ItemContent, ItemDescription, ItemTitle } from '@components/common/ui/Item.js'; import { Label } from '@components/common/ui/Label.js'; import { RadioGroup, RadioGroupItem } from '@components/common/ui/RadioGroup.js'; import { useCheckout, useCheckoutDispatch } from '@components/frontStore/checkout/CheckoutContext.js'; import CustomerAddressForm from '@components/frontStore/customer/address/addressForm/Index.js'; import { _ } from '@evershop/evershop/lib/locale/translate/_'; import { Address, CustomerAddressGraphql } from '@evershop/evershop/types/customerAddress'; import React, { useEffect, useState } from 'react'; import { useWatch } from 'react-hook-form'; export function BillingAddress({ billingAddress, addBillingAddress, addingBillingAddress, noShippingRequired }: { billingAddress?: CustomerAddressGraphql; addBillingAddress?: (address: Address) => Promise; addingBillingAddress?: boolean; noShippingRequired: boolean; }) { const { form, checkoutData } = useCheckout(); const { updateCheckoutData } = useCheckoutDispatch(); const { setValue, getValues, trigger, formState: { disabled } } = form; const shippingAddress = useWatch({ control: form.control, name: 'shippingAddress' }); const billingAddressField = useWatch({ control: form.control, name: 'billingAddress' }); const [useSameAddress, setUseSameAddress] = useState(!noShippingRequired); useEffect(() => { if (useSameAddress && shippingAddress) { updateCheckoutData({ billingAddress: shippingAddress }); } else if (!useSameAddress) { setValue('billingAddress', billingAddress); } }, [useSameAddress, checkoutData.shippingAddress]); useEffect(() => { if (!useSameAddress) { const billingAddress = { ...getValues('billingAddress') }; updateCheckoutData({ billingAddress }); } }, [billingAddressField]); const handleAddressOptionChange = (value: string) => { const isSameAddress = value === 'same'; if (isSameAddress === useSameAddress || disabled) { return; } setUseSameAddress(isSameAddress); if (!isSameAddress) { updateCheckoutData({ billingAddress: undefined }); } else if (checkoutData.shippingAddress) { updateCheckoutData({ billingAddress: checkoutData.shippingAddress }); } }; const handleGoToPayment = async () => { const isValid = await trigger('billingAddress'); if (isValid && addBillingAddress) { const billingAddressData = getValues('billingAddress'); await addBillingAddress(billingAddressData); } }; return (
{_('Billing Address')} { handleAddressOptionChange(value as string); }} > {!noShippingRequired ? ( <>
{!useSameAddress && (
{noShippingRequired && ( )}
)}
) : (
{noShippingRequired && ( )}
)}
); }