import { __experimentalToolsPanelItem as ExperimentalToolsPanelItem, __stableToolsPanelItem as StableToolsPanelItem, } from '@wordpress/components'; import { addFilter } from '@wordpress/hooks'; import { __ } from '@wordpress/i18n'; import ResponsiveToggle from '../../../components/responsive-toggle'; import ToggleGroup from '../../../components/toggle-group'; import useResponsive from '../../../hooks/use-responsive'; import { addClass, getActiveClass, hasClass, removeClass, replaceClass, } from '../../../utils/classes-replacer'; const ToolsPanelItem = StableToolsPanelItem || ExperimentalToolsPanelItem; import { getBlockSupport, hasBlockSupport } from '@wordpress/blocks'; /** * Get array for Select element. * * @param {string} screen - screen size * * @return {Array} array for Select. */ const getDefaultDisplay = function (screen = '') { return [ { label: !screen ? __('Default', 'ghostkit') : __('Inherit', 'ghostkit'), value: '', }, { label: __('Show', 'ghostkit'), value: 'block', }, { label: __('Hide', 'ghostkit'), value: 'none', }, ]; }; /** * Get current display for selected screen size. * * @param {string} className - block className. * @param {string} screen - name of screen size. * * @return {string} display value. */ function getCurrentDisplay(className, screen) { if (!screen) { if (hasClass(className, 'ghostkit-d-none')) { return 'none'; } if (hasClass(className, 'ghostkit-d-block')) { return 'block'; } } return getActiveClass(className, `ghostkit-d-${screen}`, true); } function DisplayScreenSizeTools(props) { const { attributes, setAttributes } = props; const { className } = attributes; const { device, allDevices } = useResponsive(); let hasDisplayScreenSize = false; ['', ...Object.keys(allDevices)].forEach((thisDevice) => { hasDisplayScreenSize = hasDisplayScreenSize || getCurrentDisplay(className, thisDevice); }); /** * Update display object. * * @param {string} screen - name of screen size. * @param {string} val - value for new display. */ function updateDisplay(screen, val) { let newClassName = className; if (screen) { newClassName = replaceClass( newClassName, `ghostkit-d-${screen}`, val ); } else { newClassName = removeClass(newClassName, 'ghostkit-d-none'); newClassName = removeClass(newClassName, 'ghostkit-d-block'); if (val) { newClassName = addClass(newClassName, `ghostkit-d-${val}`); } } setAttributes({ className: newClassName, }); } return ( !!hasDisplayScreenSize} onDeselect={() => { let newClassName = className; ['', ...Object.keys(allDevices)].forEach((thisDevice) => { if (thisDevice) { newClassName = removeClass( newClassName, `ghostkit-d-${thisDevice}-none` ); newClassName = removeClass( newClassName, `ghostkit-d-${thisDevice}-block` ); } else { newClassName = removeClass( newClassName, 'ghostkit-d-none' ); newClassName = removeClass( newClassName, 'ghostkit-d-block' ); } }); setAttributes({ className: newClassName, }); }} isShownByDefault={false} > {__('Screen Size', 'ghostkit')} { return ( hasClass( className, `ghostkit-d-${checkMedia}-none` ) || hasClass( className, `ghostkit-d-${checkMedia}-block` ) ); }} /> } value={getCurrentDisplay(className, device)} options={getDefaultDisplay(device).map((val) => ({ value: val.value, label: val.label, }))} onChange={(value) => { updateDisplay(device, value); }} isBlock /> ); } addFilter( 'ghostkit.extension.display.tools', 'ghostkit/extension/display/tools/screenSize', (children, { props }) => { const hasDisplayScreenSizeSupport = hasBlockSupport(props.name, [ 'ghostkit', 'display', 'screenSize', ]) || getBlockSupport(props.name, ['ghostkit', 'display']) === true; const hasCustomClassNameSupport = hasBlockSupport( props.name, 'customClassName', true ); if (!hasDisplayScreenSizeSupport || !hasCustomClassNameSupport) { return children; } return ( <> {children} ); } );