/** * External dependencies */ import { __ } from '@wordpress/i18n'; import { useShippingData } from '@woocommerce/base-context/hooks'; import { __experimentalRadio as Radio, __experimentalRadioGroup as RadioGroup, } from 'wordpress-components'; import classnames from 'classnames'; import { Icon, store, shipping } from '@wordpress/icons'; import { useEffect } from '@wordpress/element'; import { CART_STORE_KEY, VALIDATION_STORE_KEY } from '@woocommerce/block-data'; import { useDispatch, useSelect } from '@wordpress/data'; import { isPackageRateCollectable } from '@woocommerce/base-utils'; import { getSetting } from '@woocommerce/settings'; /** * Internal dependencies */ import { RatePrice, getLocalPickupPrices, getShippingPrices } from './shared'; import type { minMaxPrices } from './shared'; import { defaultLocalPickupText, defaultShippingText } from './constants'; import { shippingAddressHasValidationErrors } from '../../../../data/cart/utils'; const SHIPPING_RATE_ERROR = { hidden: true, message: __( 'Shipping options are not available', 'woocommerce' ), }; const LocalPickupSelector = ( { checked, rate, showPrice, showIcon, toggleText, multiple, }: { checked: string; rate: minMaxPrices; showPrice: boolean; showIcon: boolean; toggleText: string; multiple: boolean; } ) => { return ( { showIcon === true && ( ) } { toggleText } { showPrice === true && ( ) } ); }; const ShippingSelector = ( { checked, rate, showPrice, showIcon, toggleText, shippingCostRequiresAddress = false, }: { checked: string; rate: minMaxPrices; showPrice: boolean; showIcon: boolean; shippingCostRequiresAddress: boolean; toggleText: string; } ) => { const hasShippableRates = useSelect( ( select ) => { const rates = select( CART_STORE_KEY ).getShippingRates(); return rates.some( ( { shipping_rates: shippingRate } ) => ! shippingRate.every( isPackageRateCollectable ) ); } ); const rateShouldBeHidden = shippingCostRequiresAddress && shippingAddressHasValidationErrors() && ! hasShippableRates; const hasShippingPrices = rate.min !== undefined && rate.max !== undefined; const { setValidationErrors, clearValidationError } = useDispatch( VALIDATION_STORE_KEY ); useEffect( () => { if ( checked === 'shipping' && ! hasShippingPrices ) { setValidationErrors( { 'shipping-rates-error': SHIPPING_RATE_ERROR, } ); } else { clearValidationError( 'shipping-rates-error' ); } }, [ checked, clearValidationError, hasShippingPrices, setValidationErrors, ] ); const Price = rate.min === undefined || rateShouldBeHidden ? ( { __( 'calculated with an address', 'woocommerce' ) } ) : ( ); return ( { showIcon === true && ( ) } { toggleText } { showPrice === true && Price } ); }; const Block = ( { checked, onChange, showPrice, showIcon, localPickupText, shippingText, }: { checked: string; onChange: ( value: string ) => void; showPrice: boolean; showIcon: boolean; localPickupText: string; shippingText: string; } ): JSX.Element | null => { const { shippingRates } = useShippingData(); const shippingCostRequiresAddress = getSetting< boolean >( 'shippingCostRequiresAddress', false ); const localPickupTextFromSettings = getSetting< string >( 'localPickupText', localPickupText || defaultLocalPickupText ); return ( 1 } showPrice={ showPrice } showIcon={ showIcon } toggleText={ localPickupTextFromSettings } /> ); }; export default Block;