woocommerce/plugins/woocommerce-blocks/assets/js/base/hooks/shipping/use-shipping-address.js

47 lines
1.5 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
import { useDispatch } from '@wordpress/data';
import { useEffect, useState } from '@wordpress/element';
import isShallowEqual from '@wordpress/is-shallow-equal';
import { useDebounce } from 'use-debounce';
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
/**
* Internal dependencies
*/
import { useStoreCart } from '../cart/use-store-cart';
import { useThrowError } from '../use-throw-error';
import { pluckAddress } from '../../utils';
const shouldUpdateStore = ( oldAddress, newAddress ) =>
! isShallowEqual( pluckAddress( oldAddress ), pluckAddress( newAddress ) );
export const useShippingAddress = () => {
const { shippingAddress: initialAddress } = useStoreCart();
const [ shippingAddress, setShippingAddress ] = useState( initialAddress );
const [ debouncedShippingAddress ] = useDebounce( shippingAddress, 400 );
const { updateShippingAddress } = useDispatch( storeKey );
const throwError = useThrowError();
// Note, we're intentionally not using initialAddress as a dependency here
// so that the stale (previous) value is being used for comparison.
useEffect( () => {
if (
debouncedShippingAddress.country &&
shouldUpdateStore( initialAddress, debouncedShippingAddress )
) {
updateShippingAddress( debouncedShippingAddress ).catch(
( error ) => {
// error is non-recoverable so throw
throwError( error );
}
);
}
}, [ debouncedShippingAddress ] );
return {
shippingAddress,
setShippingAddress,
};
};