import './pro-transforms'; import { throttle } from 'throttle-debounce'; import { InspectorControls } from '@wordpress/block-editor'; import { hasBlockSupport } from '@wordpress/blocks'; import { __experimentalToolsPanel as ExperimentalToolsPanel, __stableToolsPanel as StableToolsPanel, } from '@wordpress/components'; import { createHigherOrderComponent } from '@wordpress/compose'; import { useEffect, useRef } from '@wordpress/element'; import { addFilter, applyFilters } from '@wordpress/hooks'; import { __ } from '@wordpress/i18n'; import ApplyFilters from '../../components/apply-filters'; import useStyles from '../../hooks/use-styles'; import { addClass, hasClass, removeClass } from '../../utils/classes-replacer'; import getIcon from '../../utils/get-icon'; import { EXTENSIONS } from '../constants'; const ToolsPanel = StableToolsPanel || ExperimentalToolsPanel; const allProps = EXTENSIONS.transform.styles; const keyExists = (obj, key) => { let result = false; if (typeof obj === 'object') { if (key in obj) { result = true; } else { Object.keys(obj).forEach((k) => { result = result || keyExists(obj[k], key); }); } } return result; }; /** * Add inspector controls. * * @param original * @param root0 * @param root0.props */ function GhostKitExtensionTransformInspector(original, { props }) { const { name } = props; const hasTransformSupport = hasBlockSupport(name, [ 'ghostkit', 'transform', ]); if (!hasTransformSupport) { return original; } const { resetStyles } = useStyles(props); return ( <> {original} {getIcon('extension-transform')} {__('Transform', 'ghostkit')} } resetAll={() => { resetStyles(allProps, true, ['', '&:hover']); }} >
); } function CustomClassComponent(props) { const { setAttributes, attributes } = props; const { getStyles } = useStyles(props); let hasTransform = false; const styles = getStyles(); allProps.forEach((transformProp) => { hasTransform = hasTransform || keyExists(styles, transformProp); }); function onUpdate() { let { className } = attributes; const allowTransformClassName = applyFilters( 'ghostkit.extension.transform.allowClassName', hasTransform, props ); const hasTransformClassName = hasClass( className, 'ghostkit-has-transform' ); if (allowTransformClassName && !hasTransformClassName) { className = addClass(className, 'ghostkit-has-transform'); setAttributes({ className }); } else if (!allowTransformClassName && hasTransformClassName) { className = removeClass(className, 'ghostkit-has-transform'); setAttributes({ className }); } } const onUpdateThrottle = throttle(60, onUpdate); const didMountRef = useRef(false); useEffect(() => { // Did update. if (didMountRef.current) { onUpdateThrottle(); // Did mount. } else { didMountRef.current = true; onUpdate(true); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [attributes]); return null; } /** * Override the default edit UI to include a new block inspector control for * assigning the custom styles if needed. * * @param {Function | Component} BlockEdit Original component. * * @return {string} Wrapped component. */ const withNewAttrs = createHigherOrderComponent( (BlockEdit) => function (props) { return ( <> ); }, 'withNewAttrs' ); // Init filters. addFilter( 'ghostkit.editor.extensions', 'ghostkit/extension/transform/inspector', GhostKitExtensionTransformInspector, 15 ); addFilter( 'editor.BlockEdit', 'ghostkit/extension/transform/classname', withNewAttrs );