Skip to content
This repository has been archived by the owner on Feb 23, 2024. It is now read-only.

Commit

Permalink
Fix issue that prevented spaces being added to Mini Cart, Cart and Ch…
Browse files Browse the repository at this point in the history
…eckout buttons (#8777)

* Fix issue that prevented spaces being added to Mini Cart, Cart and Checkout buttons

* Fix a couple of comments
  • Loading branch information
Aljullu committed Mar 22, 2023
1 parent c2fb453 commit 5e0d385
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,8 @@
import { useRef } from '@wordpress/element';
import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
import Button from '@woocommerce/base-components/button';
import {
InspectorControls,
RichText,
useBlockProps,
} from '@wordpress/block-editor';
import EditableButton from '@woocommerce/editor-components/editable-button';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
import PageSelector from '@woocommerce/editor-components/page-selector';
import { CART_PAGE_ID } from '@woocommerce/block-settings';

Expand Down Expand Up @@ -68,19 +64,16 @@ export const Edit = ( {
/>
) }
</InspectorControls>
<Button className="wc-block-cart__submit-button">
<RichText
multiline={ false }
allowedFormats={ [] }
value={ buttonLabel }
placeholder={ defaultButtonLabel }
onChange={ ( content ) => {
setAttributes( {
buttonLabel: content,
} );
} }
/>
</Button>
<EditableButton
className="wc-block-cart__submit-button"
value={ buttonLabel }
placeholder={ defaultButtonLabel }
onChange={ ( content ) => {
setAttributes( {
buttonLabel: content,
} );
} }
/>
</div>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,13 @@
import { useRef } from '@wordpress/element';
import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
import {
InspectorControls,
useBlockProps,
RichText,
} from '@wordpress/block-editor';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
import PageSelector from '@woocommerce/editor-components/page-selector';
import { PanelBody, ToggleControl } from '@wordpress/components';
import { CHECKOUT_PAGE_ID } from '@woocommerce/block-settings';
import { getSetting } from '@woocommerce/settings';
import { ReturnToCartButton } from '@woocommerce/base-components/cart-checkout';
import Button from '@woocommerce/base-components/button';
import EditableButton from '@woocommerce/editor-components/editable-button';
import Noninteractive from '@woocommerce/base-components/noninteractive';

/**
Expand Down Expand Up @@ -104,19 +100,16 @@ export const Edit = ( {
/>
) }
</Noninteractive>
<Button className="wc-block-cart__submit-button wc-block-components-checkout-place-order-button">
<RichText
multiline={ false }
allowedFormats={ [] }
value={ placeOrderButtonLabel }
placeholder={ defaultPlaceOrderButtonLabel }
onChange={ ( content ) => {
setAttributes( {
placeOrderButtonLabel: content,
} );
} }
/>
</Button>
<EditableButton
className="wc-block-cart__submit-button wc-block-components-checkout-place-order-button"
value={ placeOrderButtonLabel }
placeholder={ defaultPlaceOrderButtonLabel }
onChange={ ( content ) => {
setAttributes( {
placeOrderButtonLabel: content,
} );
} }
/>
</div>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
*/
import { __ } from '@wordpress/i18n';
import { TotalsItem } from '@woocommerce/blocks-checkout';
import Button from '@woocommerce/base-components/button';
import { useBlockProps, RichText } from '@wordpress/block-editor';
import EditableButton from '@woocommerce/editor-components/editable-button';
import { useBlockProps } from '@wordpress/block-editor';
import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
import {
usePaymentMethods,
Expand Down Expand Up @@ -64,35 +64,27 @@ export const Edit = ( {
) }
/>
<div className="wc-block-mini-cart__footer-actions">
<Button
<EditableButton
className="wc-block-mini-cart__footer-cart"
variant="outlined"
>
<RichText
multiline={ false }
allowedFormats={ [] }
value={ cartButtonLabel }
placeholder={ defaultCartButtonLabel }
onChange={ ( content ) => {
setAttributes( {
cartButtonLabel: content,
} );
} }
/>
</Button>
<Button className="wc-block-mini-cart__footer-checkout">
<RichText
multiline={ false }
allowedFormats={ [] }
value={ checkoutButtonLabel }
placeholder={ defaultCheckoutButtonLabel }
onChange={ ( content ) => {
setAttributes( {
checkoutButtonLabel: content,
} );
} }
/>
</Button>
value={ cartButtonLabel }
placeholder={ defaultCartButtonLabel }
onChange={ ( content ) => {
setAttributes( {
cartButtonLabel: content,
} );
} }
/>
<EditableButton
className="wc-block-mini-cart__footer-checkout"
value={ checkoutButtonLabel }
placeholder={ defaultCheckoutButtonLabel }
onChange={ ( content ) => {
setAttributes( {
checkoutButtonLabel: content,
} );
} }
/>
</div>
<PaymentEventsProvider>
<PaymentMethodIconsElement />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/**
* External dependencies
*/
import { useBlockProps, RichText } from '@wordpress/block-editor';
import Button from '@woocommerce/base-components/button';
import { useBlockProps } from '@wordpress/block-editor';
import EditableButton from '@woocommerce/editor-components/editable-button';

/**
* Internal dependencies
Expand All @@ -23,21 +23,16 @@ export const Edit = ( {

return (
<div { ...blockProps }>
<div className="wp-block-button aligncenter">
<Button className="wc-block-mini-cart__shopping-button">
<RichText
multiline={ false }
allowedFormats={ [] }
value={ startShoppingButtonLabel }
placeholder={ defaultStartShoppingButtonLabel }
onChange={ ( content ) => {
setAttributes( {
startShoppingButtonLabel: content,
} );
} }
/>
</Button>
</div>
<EditableButton
className="wc-block-mini-cart__shopping-button"
value={ startShoppingButtonLabel }
placeholder={ defaultStartShoppingButtonLabel }
onChange={ ( content ) => {
setAttributes( {
startShoppingButtonLabel: content,
} );
} }
/>
</div>
);
};
Expand Down
88 changes: 88 additions & 0 deletions assets/js/editor-components/editable-button/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* External dependencies
*/
import { useEffect, useRef } from '@wordpress/element';
import Button, { ButtonProps } from '@woocommerce/base-components/button';
import { RichText } from '@wordpress/block-editor';
import type { RefObject } from 'react';

export interface EditableButtonProps
extends Omit< ButtonProps, 'onChange' | 'placeholder' | 'value' > {
/**
* On change callback.
*/
onChange: ( value: string ) => void;
/**
* The placeholder of the editable button.
*/
placeholder?: string;
/**
* The current value of the editable button.
*/
value: string;
}

const EditableButton = ( {
onChange,
placeholder,
value,
...props
}: EditableButtonProps ) => {
const button: RefObject< HTMLButtonElement > = useRef( null );

// Fix a bug in Firefox that didn't allow to type spaces in editable buttons.
// @see https://github.com/woocommerce/woocommerce-blocks/issues/8734
useEffect( () => {
const buttonEl = button?.current;

if ( ! buttonEl ) {
return;
}

const onKeyDown = ( event: KeyboardEvent ) => {
// If the user typed something different than space, do nothing.
if ( event.code !== 'Space' ) {
return;
}
event.preventDefault();
const selection = buttonEl.ownerDocument.getSelection();
if ( selection && selection.rangeCount > 0 ) {
// Get the caret position and insert a space.
const range = selection.getRangeAt( 0 );
range.deleteContents();
const textNode = document.createTextNode( ' ' );
range.insertNode( textNode );
// Set the caret position after the space.
range.setStartAfter( textNode );
range.setEndAfter( textNode );
selection.removeAllRanges();
selection.addRange( range );
}
};

buttonEl.addEventListener( 'keydown', onKeyDown );

return () => {
if ( ! buttonEl ) {
return;
}
buttonEl.removeEventListener( 'keydown', onKeyDown );
};
}, [ onChange, value ] );

return (
<Button { ...props }>
<span ref={ button }>
<RichText
multiline={ false }
allowedFormats={ [] }
value={ value }
placeholder={ placeholder }
onChange={ onChange }
/>
</span>
</Button>
);
};

export default EditableButton;

0 comments on commit 5e0d385

Please sign in to comment.