@wordpress/block-library
Version:
Block library for the WordPress editor.
111 lines (104 loc) • 2.59 kB
JavaScript
/**
* WordPress dependencies
*/
import {
InspectorControls,
useBlockProps,
__experimentalGetSpacingClassesAndStyles as useSpacingProps,
store as blockEditorStore,
} from '@wordpress/block-editor';
import { PanelBody, ResizableBox, RangeControl } from '@wordpress/components';
import { useEntityProp } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { __, isRTL } from '@wordpress/i18n';
export default function Edit( {
attributes,
context: { commentId },
setAttributes,
isSelected,
} ) {
const { height, width } = attributes;
const [ avatars ] = useEntityProp(
'root',
'comment',
'author_avatar_urls',
commentId
);
const [ authorName ] = useEntityProp(
'root',
'comment',
'author_name',
commentId
);
const avatarUrls = avatars ? Object.values( avatars ) : null;
const sizes = avatars ? Object.keys( avatars ) : null;
const minSize = sizes ? sizes[ 0 ] : 24;
const maxSize = sizes ? sizes[ sizes.length - 1 ] : 96;
const blockProps = useBlockProps();
const spacingProps = useSpacingProps( attributes );
const maxSizeBuffer = Math.floor( maxSize * 2.5 );
const { avatarURL } = useSelect( ( select ) => {
const { getSettings } = select( blockEditorStore );
const { __experimentalDiscussionSettings } = getSettings();
return __experimentalDiscussionSettings;
} );
const inspectorControls = (
<InspectorControls>
<PanelBody title={ __( 'Settings' ) }>
<RangeControl
__nextHasNoMarginBottom
__next40pxDefaultSize
label={ __( 'Image size' ) }
onChange={ ( newWidth ) =>
setAttributes( {
width: newWidth,
height: newWidth,
} )
}
min={ minSize }
max={ maxSizeBuffer }
initialPosition={ width }
value={ width }
/>
</PanelBody>
</InspectorControls>
);
const resizableAvatar = (
<ResizableBox
size={ {
width,
height,
} }
showHandle={ isSelected }
onResizeStop={ ( event, direction, elt, delta ) => {
setAttributes( {
height: parseInt( height + delta.height, 10 ),
width: parseInt( width + delta.width, 10 ),
} );
} }
lockAspectRatio
enable={ {
top: false,
right: ! isRTL(),
bottom: true,
left: isRTL(),
} }
minWidth={ minSize }
maxWidth={ maxSizeBuffer }
>
<img
src={
avatarUrls ? avatarUrls[ avatarUrls.length - 1 ] : avatarURL
}
alt={ `${ authorName } ${ __( 'Avatar' ) }` }
{ ...blockProps }
/>
</ResizableBox>
);
return (
<>
{ inspectorControls }
<div { ...spacingProps }>{ resizableAvatar }</div>
</>
);
}