import { Fragment, createElement, Component, useRef, useEffect, useMemo, useCallback, createPortal, useState, } from '@wordpress/element' import cls from 'classnames' import BackgroundModal from './background/BackgroundModal' import OutsideClickHandler from './react-outside-click-handler' import { getUrlForPattern } from './background/PatternPicker' import { __ } from 'ct-i18n' import usePopoverMaker from '../helpers/usePopoverMaker' /** * Support color picker values inside the background picker. * Which means transitions from ct-color-picker are made possible thanks to * this logic. */ const maybeConvertFromColorPickerTo = (value) => { if (!value.background_type) { if (value[Object.keys(value)[0]].color) { return { background_type: 'color', background_pattern: 'type-1', background_image: { attachment_id: null, x: 0, y: 0, }, background_repeat: 'no-repeat', background_size: 'auto', background_attachment: 'scroll', patternColor: { default: { color: '#e5e7ea', }, }, backgroundColor: { default: value[Object.keys(value)[0]], }, } } } return value } const Background = ({ option, value, onChange }) => { const [isOpen, setIsOpen] = useState(false) const [outsideClickFreezed, setOutsideClickFreezed] = useState(false) const backgroundWrapper = useRef() value = maybeConvertFromColorPickerTo(value) const isInherit = !option.has_no_color && value.background_type === 'color' && (value.backgroundColor.default.color === 'CT_CSS_SKIP_RULE' || value.backgroundColor.default.color === 'transparent') const isNoColor = option.has_no_color && value.background_type === 'color' && (value.backgroundColor.default.color === 'CT_CSS_SKIP_RULE' || value.backgroundColor.default.color === 'transparent') const { styles, popoverProps } = usePopoverMaker({ ref: backgroundWrapper, defaultHeight: 434, shouldCalculate: backgroundWrapper && backgroundWrapper.current, }) return (
{ e.preventDefault() setIsOpen(!isOpen) if (value.background_type === 'color') { if ( value.backgroundColor.default.color === 'CT_CSS_SKIP_RULE' || value.backgroundColor.default.color === 'transparent' ) { onChange({ ...value, backgroundColor: { default: { color: option.default_inherit_color || '#ffffff', }, }, }) } } }} data-background-type={value.background_type} style={{ ...(value.backgroundColor.default.color.indexOf( 'CT_CSS_SKIP_RULE' ) > -1 ? {} : { backgroundColor: value.backgroundColor.default.color, }), '--background-position': `${Math.round( parseFloat(value.background_image.x) * 100 )}% ${Math.round( parseFloat(value.background_image.y) * 100 )}%`, '--pattern-mask': value.background_type === 'pattern' ? `url(${getUrlForPattern( value.background_pattern )})` : '', '--background-image': value.background_type === 'gradient' ? value.gradient : value.background_image.url ? `${ value.overlayColor && value.overlayColor.default.color.indexOf( 'CT_CSS_SKIP_RULE' ) === -1 ? `linear-gradient(${value.overlayColor.default.color}, ${value.overlayColor.default.color}), ` : '' }url(${value.background_image.url})` : 'none', '--pattern-color': value.patternColor.default.color, }}> { { inherit: __('Inherited', 'blocksy'), no_color: __('No Color', 'blocksy'), pattern: __('Pattern', 'blocksy'), gradient: __('Gradient', 'blocksy'), color: __('Color', 'blocksy'), image: __('Image', 'blocksy'), }[ isNoColor ? 'no_color' : isInherit ? 'inherit' : value.background_type ] } {isInherit && ( )}
{backgroundWrapper && backgroundWrapper.current && createPortal( { if (e.target.closest('.components-popover')) { return } setTimeout(() => setIsOpen(false)) }} wrapperProps={{ style: styles, ...popoverProps, className: cls( 'ct-option-modal ct-background-modal', { active: isOpen, } ), }}> , document.body )}
) } export default Background