/* eslint-disable @wordpress/no-unsafe-wp-apis */ /** * External dependencies */ import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; import { formatPrice } from '@woocommerce/price-format'; import { PanelBody, ExternalLink, ToggleControl, BaseControl, __experimentalToggleGroupControlOption as ToggleGroupControlOption, __experimentalToggleGroupControl as ToggleGroupControl, RadioControl, } from '@wordpress/components'; import { getSetting } from '@woocommerce/settings'; import { __, isRTL } from '@wordpress/i18n'; import Noninteractive from '@woocommerce/base-components/noninteractive'; import { isSiteEditorPage } from '@woocommerce/utils'; import type { ReactElement } from 'react'; import { useEffect } from '@wordpress/element'; import { select } from '@wordpress/data'; import { cartOutline, bag, bagAlt } from '@woocommerce/icons'; import { Icon } from '@wordpress/icons'; import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings'; import { ColorPanel } from '@woocommerce/editor-components/color-panel'; import type { ColorPaletteOption } from '@woocommerce/editor-components/color-panel/types'; /** * Internal dependencies */ import QuantityBadge from './quantity-badge'; import { defaultColorItem } from './utils/defaults'; import { migrateAttributesToColorPanel } from './utils/data'; import './editor.scss'; export interface Attributes { miniCartIcon: 'cart' | 'bag' | 'bag-alt'; addToCartBehaviour: string; hasHiddenPrice: boolean; cartAndCheckoutRenderStyle: boolean; priceColor: ColorPaletteOption; iconColor: ColorPaletteOption; productCountColor: ColorPaletteOption; productCountVisibility: 'always' | 'never' | 'greater_than_zero'; } interface Props { attributes: Attributes; setAttributes: ( attributes: Record< string, unknown > ) => void; clientId: number; setPriceColor: ( colorValue: string | undefined ) => void; setIconColor: ( colorValue: string | undefined ) => void; setProductCountColor: ( colorValue: string | undefined ) => void; } const Edit = ( { attributes, setAttributes }: Props ): ReactElement => { const { cartAndCheckoutRenderStyle, addToCartBehaviour, hasHiddenPrice, priceColor = defaultColorItem, iconColor = defaultColorItem, productCountColor = defaultColorItem, miniCartIcon, productCountVisibility, } = migrateAttributesToColorPanel( attributes ); const miniCartColorAttributes = { priceColor: { label: __( 'Price', 'woocommerce' ), context: 'price-color', }, iconColor: { label: __( 'Icon', 'woocommerce' ), context: 'icon-color', }, productCountColor: { label: __( 'Product Count', 'woocommerce' ), context: 'product-count-color', }, }; const blockProps = useBlockProps( { className: 'wc-block-mini-cart', } ); const isSiteEditor = isSiteEditorPage( select( 'core/edit-site' ) ); const templatePartEditUri = getSetting( 'templatePartEditUri', '' ) as string; /** * This is a workaround for the Site Editor to set the correct * background color of the Mini-Cart QuantityBadge block based on * the main background color set by the theme. */ useEffect( () => { let editorStylesWrapper = document.querySelector( '.editor-styles-wrapper' ); // If the editor styles wrapper is not available, look in the site editor canvas for it. if ( ! editorStylesWrapper ) { const canvasEl = document.querySelector( '.edit-site-visual-editor__editor-canvas' ); if ( ! ( canvasEl instanceof HTMLIFrameElement ) ) { return; } const canvas = canvasEl.contentDocument || canvasEl.contentWindow?.document; if ( ! canvas ) { return; } editorStylesWrapper = canvas.querySelector( '.editor-styles-wrapper' ); } if ( ! editorStylesWrapper ) { return; } const editorBackgroundColor = window.getComputedStyle( editorStylesWrapper )?.backgroundColor; const editorColor = window.getComputedStyle( editorStylesWrapper )?.color; if ( editorStylesWrapper && ! editorStylesWrapper.querySelector( '#mini-cart-quantity-badge-foreground-color' ) && editorBackgroundColor && editorColor ) { const style = document.createElement( 'style' ); style.id = 'mini-cart-quantity-badge-foreground-color'; style.appendChild( document.createTextNode( `:where(.wc-block-mini-cart__badge) { color: ${ editorBackgroundColor }; background-color: ${ editorColor }; }` ) ); editorStylesWrapper.appendChild( style ); } }, [] ); const productCount = productCountVisibility === 'never' || productCountVisibility === 'always' ? 0 : 2; const productTotal = 0; return (
{ __( 'When opened, the Mini-Cart drawer gives shoppers quick access to view their selected products and checkout.', 'woocommerce' ) }