/** * External dependencies */ import { useState, useCallback, useEffect } from '@wordpress/element'; import { AddressForm } from '@woocommerce/base-components/cart-checkout'; import { useCheckoutAddress, useStoreEvents, useEditorContext, } from '@woocommerce/base-context'; import type { ShippingAddress, AddressField, AddressFields, } from '@woocommerce/settings'; import { useSelect } from '@wordpress/data'; import { VALIDATION_STORE_KEY } from '@woocommerce/block-data'; /** * Internal dependencies */ import AddressWrapper from '../../address-wrapper'; import AddressCard from '../../address-card'; const CustomerAddress = ( { addressFieldsConfig, }: { addressFieldsConfig: Record< keyof AddressFields, Partial< AddressField > >; } ) => { const { defaultAddressFields, shippingAddress, setShippingAddress, setBillingAddress, useShippingAsBilling, } = useCheckoutAddress(); const { dispatchCheckoutEvent } = useStoreEvents(); const { isEditor } = useEditorContext(); const hasAddress = !! ( shippingAddress.address_1 && ( shippingAddress.first_name || shippingAddress.last_name ) ); const [ editing, setEditing ] = useState( ! hasAddress || isEditor ); // Forces editing state if store has errors. const { hasValidationErrors, invalidProps } = useSelect( ( select ) => { const store = select( VALIDATION_STORE_KEY ); return { hasValidationErrors: store.hasValidationErrors(), invalidProps: Object.keys( shippingAddress ) .filter( ( key ) => { return ( store.getValidationError( 'shipping_' + key ) !== undefined ); } ) .filter( Boolean ), }; } ); useEffect( () => { if ( invalidProps.length > 0 && editing === false ) { setEditing( true ); } }, [ editing, hasValidationErrors, invalidProps.length ] ); const addressFieldKeys = Object.keys( defaultAddressFields ) as ( keyof AddressFields )[]; const onChangeAddress = useCallback( ( values: Partial< ShippingAddress > ) => { setShippingAddress( values ); if ( useShippingAsBilling ) { setBillingAddress( values ); dispatchCheckoutEvent( 'set-billing-address' ); } dispatchCheckoutEvent( 'set-shipping-address' ); }, [ dispatchCheckoutEvent, setBillingAddress, setShippingAddress, useShippingAsBilling, ] ); const renderAddressCardComponent = useCallback( () => ( { setEditing( true ); } } fieldConfig={ addressFieldsConfig } /> ), [ shippingAddress, addressFieldsConfig ] ); const renderAddressFormComponent = useCallback( () => ( ), [ addressFieldKeys, addressFieldsConfig, onChangeAddress, shippingAddress, ] ); return ( ); }; export default CustomerAddress;