import clsx from 'clsx'; import { useState } from 'react'; import { useAppDispatch, useAppSelector } from '@akinon/next/redux/hooks'; import { RootState } from '@theme/redux/store'; import { useEditAddressMutation, useRemoveAddressMutation } from '@akinon/next/data/client/address'; import { useSetAddressesMutation, useSetRetailStoreMutation, useSetShippingOptionMutation } from '@akinon/next/data/client/checkout'; import { Address, CheckoutAddressType } from '@akinon/next/types'; import { Button, Modal, Radio } from '@theme/components'; import { resetCheckoutState } from '@akinon/next/redux/reducers/checkout'; import { AddressForm } from '@theme/views/account/address-form'; import { useLocalization } from '@akinon/next/hooks'; interface AddressBoxProps { addressType: CheckoutAddressType; address: Address; isBillingAddressSame: boolean; disabled: boolean; } const AddressBox = ({ addressType, address, isBillingAddressSame, disabled }: AddressBoxProps) => { const { t } = useLocalization(); const [isEditAddressModalOpen, setIsEditAddressModalOpen] = useState(false); const [isRemoveAddressModalOpen, setRemoveAddressModalOpen] = useState(false); const { shipping_address, billing_address, delivery_option, retail_store } = useAppSelector((state: RootState) => state.checkout.preOrder) ?? {}; const addressList = useAppSelector( (state: RootState) => state.checkout.addressList ); const [setShippingOption] = useSetShippingOptionMutation(); const [setRetailStore] = useSetRetailStoreMutation(); const [setAddresses] = useSetAddressesMutation(); const [editAddress] = useEditAddressMutation(); const [removeAddress, { isLoading: removeAddressLoading }] = useRemoveAddressMutation(); const dispatch = useAppDispatch(); const handleAddressClick = ( addressType: CheckoutAddressType, address: Address ) => { if (addressType.value === address.pk) { return; } const addresses = { shippingAddressPk: shipping_address?.pk, billingAddressPk: billing_address?.pk }; if (isBillingAddressSame) { Object.keys(addresses).forEach((key) => { addresses[key] = address.pk; }); } else { addresses[addressType.requestParam] = address.pk; } if (!delivery_option) { console.warn( 'The delivery option was not found, please add one or more options from Omnitron.' ); } if (delivery_option?.delivery_option_type === 'retail_store') { setShippingOption(delivery_option.pk).unwrap(); setRetailStore({ retailStorePk: retail_store.pk, billingAddressPk: address.pk }); } else { setAddresses(addresses); } }; const onSubmit = (data) => { editAddress({ ...data, invalidateTag: 'Checkout' }) .unwrap() .then((editAddressResponse) => { handleAddressClick(addressType, editAddressResponse); }) .catch(); setIsEditAddressModalOpen(false); }; const handleRemoveAddress = async (addressPk: number) => { await removeAddress({ id: addressPk, invalidateTag: 'Checkout' }); setRemoveAddressModalOpen(false); dispatch(resetCheckoutState()); if ( addressPk === shipping_address?.pk || addressPk === billing_address?.pk ) { const newAddressList = addressList.filter((address) => { if (address.pk !== addressPk) { return address.pk; } }); const addresses = { shippingAddressPk: addressPk === shipping_address?.pk ? newAddressList[0]?.pk : shipping_address?.pk, billingAddressPk: addressPk === billing_address?.pk ? newAddressList[0]?.pk : billing_address?.pk }; setAddresses(addresses); } }; return (
handleAddressClick(addressType, address)} key={address.pk} className={clsx( 'cursor-pointer relative w-full border shadow p-4 min-h-[8rem]', "hover:after:content-[''] hover:after:border-4 hover:after:opacity-30 hover:after:transition-opacity", 'after:border-secondary-400 after:absolute after:inset-0 after:duration-150 after:-z-10', { 'after:opacity-0': addressType.value !== address.pk }, { 'after:border-4 after:opacity-100': addressType.value === address.pk }, { 'opacity-30 select-none pointer-events-none': disabled } )} > null} > {t('checkout.address.box.shipping_to')}:

{address.title}

{address.phone_number}

{address.line}

{address.township.name} / {address.city.name}

e.stopPropagation()}>
e.stopPropagation()} >

{t('account.address_book.modal.delete_description')}

); }; export default AddressBox;