/** * External dependencies */ import classNames from 'classnames'; import { __, _n, sprintf } from '@wordpress/i18n'; import { useState, useEffect, useRef } from '@wordpress/element'; import { translateJQueryEventToNative, getIconsFromPaymentMethods, } from '@woocommerce/base-utils'; import { useStoreCart, usePaymentMethods, } from '@woocommerce/base-context/hooks'; import Drawer from '@woocommerce/base-components/drawer'; import { formatPrice, getCurrencyFromPriceResponse, } from '@woocommerce/price-format'; import { getSetting } from '@woocommerce/settings'; import { TotalsItem } from '@woocommerce/blocks-checkout'; import PaymentMethodIcons from '@woocommerce/base-components/cart-checkout/payment-method-icons'; import { CART_URL, CHECKOUT_URL } from '@woocommerce/block-settings'; import Button from '@woocommerce/base-components/button'; import { PaymentMethodDataProvider } from '@woocommerce/base-context'; /** * Internal dependencies */ import CartLineItemsTable from '../cart/cart-line-items-table'; import QuantityBadge from './quantity-badge'; import './style.scss'; interface MiniCartBlockProps { isInitiallyOpen?: boolean; } const PaymentMethodIconsElement = (): JSX.Element => { const { paymentMethods } = usePaymentMethods(); return ( ); }; const MiniCartBlock = ( { isInitiallyOpen = false, }: MiniCartBlockProps ): JSX.Element => { const { cartItems, cartItemsCount, cartIsLoading, cartTotals, } = useStoreCart(); const [ isOpen, setIsOpen ] = useState< boolean >( isInitiallyOpen ); const emptyCartRef = useRef< HTMLDivElement | null >( null ); // We already rendered the HTML drawer placeholder, so we want to skip the // slide in animation. const [ skipSlideIn, setSkipSlideIn ] = useState< boolean >( isInitiallyOpen ); useEffect( () => { const openMiniCart = () => { setSkipSlideIn( false ); setIsOpen( true ); }; // Make it so we can read jQuery events triggered by WC Core elements. const removeJQueryAddedToCartEvent = translateJQueryEventToNative( 'added_to_cart', 'wc-blocks_added_to_cart' ); document.body.addEventListener( 'wc-blocks_added_to_cart', openMiniCart ); return () => { removeJQueryAddedToCartEvent(); document.body.removeEventListener( 'wc-blocks_added_to_cart', openMiniCart ); }; }, [] ); useEffect( () => { // If the cart has been completely emptied, move focus to empty cart // element. if ( isOpen && ! cartIsLoading && cartItems.length === 0 ) { if ( emptyCartRef.current instanceof HTMLElement ) { emptyCartRef.current.focus(); } } }, [ isOpen, cartIsLoading, cartItems.length, emptyCartRef ] ); const subTotal = getSetting( 'displayCartPricesIncludingTax', false ) ? parseInt( cartTotals.total_items, 10 ) + parseInt( cartTotals.total_items_tax, 10 ) : parseInt( cartTotals.total_items, 10 ); const ariaLabel = sprintf( /* translators: %1$d is the number of products in the cart. %2$s is the cart total */ _n( '%1$d item in cart, total price of %2$s', '%1$d items in cart, total price of %2$s', cartItemsCount, 'woo-gutenberg-products-block' ), cartItemsCount, formatPrice( subTotal, getCurrencyFromPriceResponse( cartTotals ) ) ); const contents = ! cartIsLoading && cartItems.length === 0 ? (
{ __( 'Cart is empty', 'woo-gutenberg-products-block' ) }
) : ( <>
); return ( <> { setIsOpen( false ); } } slideIn={ ! skipSlideIn } > { contents } ); }; export default MiniCartBlock;