/** * External dependencies */ import { isEmpty } from 'lodash' /** * WordPress dependencies */ import { __ } from '@wordpress/i18n' import { Fragment } from '@wordpress/element' import { applyFilters } from '@wordpress/hooks' import { Button, Dashicon, TextControl, ToggleControl, } from '@wordpress/components' import { BlockControls, AlignmentToolbar, RichText, MediaUpload, useBlockProps, } from '@wordpress/block-editor' /** * Internal dependencies */ import Step from './components/Step' import Inspector from './components/inspector' import generateId from '@helpers/generateId' import MediaUploader from '@blocks/shared/MediaUploader' /** * Add an empty Step into block. * * @param {Object} props Block props. */ const addNew = ( props ) => { const { steps } = props.attributes const newSteps = isEmpty( steps ) ? [] : [ ...steps ] newSteps.push( { id: generateId( 'howto-step' ), title: '', content: '', visible: true, } ) props.setAttributes( { steps: newSteps } ) } /** * Toggle duration form visibility. * * @param {Object} props Block props */ const toggleDuration = ( props ) => { props.setAttributes( { hasDuration: ! props.attributes.hasDuration, } ) } /** * When an image selected. * * @param {Object} image Seelected image object. * @param {Object} props Block props. */ const onSelectImage = ( image, props ) => { const { setAttributes } = props setAttributes( { imageID: image.id } ) } /** * Remove image from step. * * @param {Object} props Block props. */ const removeImage = ( props ) => { const { setAttributes } = props setAttributes( { imageID: 0 } ) } /** * Render Steps component. * * @param {Object} props Block props. * @return {Array} Array of step editor. */ const renderSteps = ( props ) => { const { steps, sizeSlug, titleWrapper, titleCssClasses, contentCssClasses, } = props.attributes if ( isEmpty( steps ) ) { return null } return steps.map( ( step, index ) => { return (
  • ) } ) } /** * HowTo block edit component. * * @param {Object} props Block props. */ export default ( props ) => { const { className, isSelected, attributes, setAttributes } = props const { imageID, mainSizeSlug, textAlign } = attributes const blockProps = useBlockProps() return (
    { isSelected && } { isSelected && ( props.setAttributes( { textAlign: nextTextAlignment, } ) } /> ) } (
    { removeImage( props ) } } />
    ) } onSelect={ ( image ) => { onSelectImage( image, props ) } } /> { setAttributes( { description } ) } } placeholder={ __( 'Enter a main description', 'rank-math' ) } />
    { __( 'Duration', 'rank-math' ) } { toggleDuration( props ) } } />
    { setAttributes( { timeLabel } ) } } /> { setAttributes( { days } ) } } /> { setAttributes( { hours } ) } } /> { setAttributes( { minutes } ) } } />
    { __( 'Optional, use first field to describe the duration.', 'rank-math' ) }
    { applyFilters( 'rank_math_block_howto_data', '', props ) }
      { renderSteps( props ) }
    ) }