/**
* 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 (
);
};