/** * External dependencies */ import { __ } from '@wordpress/i18n'; import classnames from 'classnames'; import { InnerBlocks, useBlockProps, InspectorControls, } from '@wordpress/block-editor'; import { SidebarLayout } from '@woocommerce/base-components/sidebar-layout'; import { CheckoutProvider, EditorProvider, useEditorContext, } from '@woocommerce/base-context'; import { previewCart, previewSavedPaymentMethods, } from '@woocommerce/resource-previews'; import { PanelBody, ToggleControl, CheckboxControl, Notice, } from '@wordpress/components'; import { CartCheckoutFeedbackPrompt } from '@woocommerce/editor-components/feedback-prompt'; import { CHECKOUT_PAGE_ID } from '@woocommerce/block-settings'; import { createInterpolateElement } from '@wordpress/element'; import { getAdminLink } from '@woocommerce/settings'; import { CartCheckoutCompatibilityNotice } from '@woocommerce/editor-components/compatibility-notices'; /** * Internal dependencies */ import './styles/editor.scss'; import { Columns } from './columns'; import { addClassToBody, useBlockPropsWithLocking } from './hacks'; import { CheckoutBlockContext, CheckoutBlockControlsContext } from './context'; import type { Attributes } from './types'; // This is adds a class to body to signal if the selected block is locked addClassToBody(); // Array of allowed block names. const ALLOWED_BLOCKS: string[] = [ 'woocommerce/checkout-fields-block', 'woocommerce/checkout-totals-block', ]; const BlockSettings = ( { attributes, setAttributes, }: { attributes: Attributes; setAttributes: ( attributes: Record< string, unknown > ) => undefined; } ): JSX.Element => { const { hasDarkControls } = attributes; const { currentPostId } = useEditorContext(); return ( { currentPostId !== CHECKOUT_PAGE_ID && ( { createInterpolateElement( __( 'If you would like to use this block as your default checkout you must update your page settings in WooCommerce.', 'woo-gutenberg-products-block' ), { a: ( // eslint-disable-next-line jsx-a11y/anchor-has-content ), } ) } ) } setAttributes( { hasDarkControls: ! hasDarkControls, } ) } /> ); }; export const Edit = ( { attributes, setAttributes, }: { attributes: Attributes; setAttributes: ( attributes: Record< string, unknown > ) => undefined; } ): JSX.Element => { const { allowCreateAccount, showCompanyField, requireCompanyField, showApartmentField, showPhoneField, requirePhoneField, showOrderNotes, showPolicyLinks, showReturnToCart, showRateAfterTaxName, cartPageId, } = attributes; const defaultInnerBlocksTemplate = [ [ 'woocommerce/checkout-fields-block', {}, [ [ 'woocommerce/checkout-express-payment-block', {}, [] ], [ 'woocommerce/checkout-contact-information-block', {}, [] ], [ 'woocommerce/checkout-shipping-address-block', {}, [] ], [ 'woocommerce/checkout-billing-address-block', {}, [] ], [ 'woocommerce/checkout-shipping-methods-block', {}, [] ], [ 'woocommerce/checkout-payment-block', {}, [] ], showOrderNotes ? [ 'woocommerce/checkout-order-note-block', {}, [] ] : false, showPolicyLinks ? [ 'woocommerce/checkout-terms-block', {}, [] ] : false, [ 'woocommerce/checkout-actions-block', { showReturnToCart, cartPageId, }, [], ], ].filter( Boolean ), ], [ 'woocommerce/checkout-totals-block', {}, [ [ 'woocommerce/checkout-order-summary-block', { showRateAfterTaxName, }, [], ], ], ], ]; const toggleAttribute = ( key: keyof Attributes ): void => { const newAttributes = {} as Partial< Attributes >; newAttributes[ key ] = ! ( attributes[ key ] as boolean ); setAttributes( newAttributes ); }; const accountControls = (): JSX.Element => ( setAttributes( { allowCreateAccount: ! allowCreateAccount, } ) } /> ); const addressFieldControls = (): JSX.Element => (

{ __( 'Show or hide fields in the checkout address forms.', 'woo-gutenberg-products-block' ) }

toggleAttribute( 'showCompanyField' ) } /> { showCompanyField && ( toggleAttribute( 'requireCompanyField' ) } className="components-base-control--nested" /> ) } toggleAttribute( 'showApartmentField' ) } /> toggleAttribute( 'showPhoneField' ) } /> { showPhoneField && ( toggleAttribute( 'requirePhoneField' ) } className="components-base-control--nested" /> ) }
); const blockProps = useBlockPropsWithLocking(); return (
); }; export const Save = (): JSX.Element => { return (
); };