Introduce Toggle between Shipping Options and Pickup Locations (https://github.com/woocommerce/woocommerce-blocks/pull/7308)

* prefersCollection controls shipping visibility

* Toggle shipping visibility based on prefersCollection

* Remove log

* Toggle in admin
This commit is contained in:
Mike Jolley 2022-10-06 13:00:30 +01:00 committed by Nadir Seghir
parent 4263b57d2c
commit b74a9f92f2
4 changed files with 42 additions and 9 deletions

View File

@ -39,8 +39,12 @@ interface CheckoutAddress {
*/ */
export const useCheckoutAddress = (): CheckoutAddress => { export const useCheckoutAddress = (): CheckoutAddress => {
const { needsShipping } = useShippingData(); const { needsShipping } = useShippingData();
const useShippingAsBilling = useSelect( ( select ) => const { useShippingAsBilling, prefersCollection } = useSelect(
select( CHECKOUT_STORE_KEY ).getUseShippingAsBilling() ( select ) => ( {
useShippingAsBilling:
select( CHECKOUT_STORE_KEY ).getUseShippingAsBilling(),
prefersCollection: select( CHECKOUT_STORE_KEY ).prefersCollection(),
} )
); );
const { __internalSetUseShippingAsBilling } = const { __internalSetUseShippingAsBilling } =
useDispatch( CHECKOUT_STORE_KEY ); useDispatch( CHECKOUT_STORE_KEY );
@ -89,8 +93,10 @@ export const useCheckoutAddress = (): CheckoutAddress => {
defaultAddressFields, defaultAddressFields,
useShippingAsBilling, useShippingAsBilling,
setUseShippingAsBilling: __internalSetUseShippingAsBilling, setUseShippingAsBilling: __internalSetUseShippingAsBilling,
showShippingFields: ! forcedBillingAddress && needsShipping, showShippingFields:
showBillingFields: ! needsShipping || ! useShippingAsBilling, ! forcedBillingAddress && needsShipping && ! prefersCollection,
showBillingFields:
! needsShipping || ! useShippingAsBilling || prefersCollection,
forcedBillingAddress, forcedBillingAddress,
}; };
}; };

View File

@ -20,6 +20,8 @@ import {
import { useShippingData } from '@woocommerce/base-context/hooks'; import { useShippingData } from '@woocommerce/base-context/hooks';
import { innerBlockAreas } from '@woocommerce/blocks-checkout'; import { innerBlockAreas } from '@woocommerce/blocks-checkout';
import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart'; import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
import { useDispatch, useSelect } from '@wordpress/data';
import { CHECKOUT_STORE_KEY } from '@woocommerce/block-data';
/** /**
* Internal dependencies * Internal dependencies
@ -155,7 +157,13 @@ export const Edit = ( {
}; };
setAttributes: ( attributes: Record< string, unknown > ) => void; setAttributes: ( attributes: Record< string, unknown > ) => void;
} ): JSX.Element => { } ): JSX.Element => {
const [ currentView, changeView ] = useState( 'shipping' ); const { setPrefersCollection } = useDispatch( CHECKOUT_STORE_KEY );
const { prefersCollection } = useSelect( ( select ) => {
const checkoutStore = select( CHECKOUT_STORE_KEY );
return {
prefersCollection: checkoutStore.prefersCollection(),
};
} );
const { showPrice, showIcon, className, localPickupText, shippingText } = const { showPrice, showIcon, className, localPickupText, shippingText } =
attributes; attributes;
const { shippingRates } = useShippingData(); const { shippingRates } = useShippingData();
@ -165,6 +173,15 @@ export const Edit = ( {
const shippingStartingPrice = getShippingStartingPrice( const shippingStartingPrice = getShippingStartingPrice(
shippingRates[ 0 ]?.shipping_rates shippingRates[ 0 ]?.shipping_rates
); );
const changeView = ( method: string ) => {
if ( method === 'pickup' ) {
setPrefersCollection( true );
} else {
setPrefersCollection( false );
}
};
return ( return (
<FormStepBlock <FormStepBlock
attributes={ attributes } attributes={ attributes }
@ -215,10 +232,10 @@ export const Edit = ( {
className="wc-block-checkout__collection-method-container" className="wc-block-checkout__collection-method-container"
label="options" label="options"
onChange={ changeView } onChange={ changeView }
checked={ currentView } checked={ prefersCollection ? 'pickup' : 'shipping' }
> >
<ShippingSelector <ShippingSelector
checked={ currentView } checked={ prefersCollection ? 'pickup' : 'shipping' }
rate={ shippingStartingPrice } rate={ shippingStartingPrice }
showPrice={ showPrice } showPrice={ showPrice }
showIcon={ showIcon } showIcon={ showIcon }
@ -226,7 +243,7 @@ export const Edit = ( {
toggleText={ shippingText } toggleText={ shippingText }
/> />
<LocalPickupSelector <LocalPickupSelector
checked={ currentView } checked={ prefersCollection ? 'pickup' : 'shipping' }
rate={ localPickupStartingPrice } rate={ localPickupStartingPrice }
showPrice={ showPrice } showPrice={ showPrice }
showIcon={ showIcon } showIcon={ showIcon }

View File

@ -3,6 +3,7 @@
*/ */
import classnames from 'classnames'; import classnames from 'classnames';
import { useBlockProps } from '@wordpress/block-editor'; import { useBlockProps } from '@wordpress/block-editor';
import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
import { innerBlockAreas } from '@woocommerce/blocks-checkout'; import { innerBlockAreas } from '@woocommerce/blocks-checkout';
import { useCheckoutAddress } from '@woocommerce/base-context/hooks'; import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
/** /**
@ -41,9 +42,11 @@ export const Edit = ( {
const { addressFieldControls: Controls } = const { addressFieldControls: Controls } =
useCheckoutBlockControlsContext(); useCheckoutBlockControlsContext();
const { showShippingFields } = useCheckoutAddress(); const { showShippingFields } = useCheckoutAddress();
if ( ! showShippingFields ) { if ( ! showShippingFields ) {
return null; return null;
} }
return ( return (
<FormStepBlock <FormStepBlock
setAttributes={ setAttributes } setAttributes={ setAttributes }

View File

@ -8,6 +8,7 @@ import { PanelBody, ExternalLink } from '@wordpress/components';
import { ADMIN_URL, getSetting } from '@woocommerce/settings'; import { ADMIN_URL, getSetting } from '@woocommerce/settings';
import ExternalLinkCard from '@woocommerce/editor-components/external-link-card'; import ExternalLinkCard from '@woocommerce/editor-components/external-link-card';
import { innerBlockAreas } from '@woocommerce/blocks-checkout'; import { innerBlockAreas } from '@woocommerce/blocks-checkout';
import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
import Noninteractive from '@woocommerce/base-components/noninteractive'; import Noninteractive from '@woocommerce/base-components/noninteractive';
/** /**
@ -37,7 +38,7 @@ export const Edit = ( {
className: string; className: string;
}; };
setAttributes: ( attributes: Record< string, unknown > ) => void; setAttributes: ( attributes: Record< string, unknown > ) => void;
} ): JSX.Element => { } ): JSX.Element | null => {
const globalShippingMethods = getSetting( const globalShippingMethods = getSetting(
'globalShippingMethods' 'globalShippingMethods'
) as shippingAdminLink[]; ) as shippingAdminLink[];
@ -45,6 +46,12 @@ export const Edit = ( {
'activeShippingZones' 'activeShippingZones'
) as shippingAdminLink[]; ) as shippingAdminLink[];
const { showShippingFields } = useCheckoutAddress();
if ( ! showShippingFields ) {
return null;
}
return ( return (
<FormStepBlock <FormStepBlock
attributes={ attributes } attributes={ attributes }