@wordpress/block-library
Version:
Block library for the WordPress editor.
231 lines (224 loc) • 5.15 kB
JavaScript
/**
* External dependencies
*/
import classnames from 'classnames';
/**
* WordPress dependencies
*/
import {
InspectorControls,
useBlockProps,
__experimentalUseBorderProps as useBorderProps,
} from '@wordpress/block-editor';
import {
PanelBody,
RangeControl,
ResizableBox,
ToggleControl,
} from '@wordpress/components';
import { __, isRTL } from '@wordpress/i18n';
import { addQueryArgs, removeQueryArgs } from '@wordpress/url';
/**
* Internal dependencies
*/
import { useUserAvatar, useCommentAvatar } from './hooks';
import UserControl from './user-control';
const AvatarInspectorControls = ( {
setAttributes,
avatar,
attributes,
selectUser,
} ) => (
<InspectorControls>
<PanelBody title={ __( 'Settings' ) }>
<RangeControl
label={ __( 'Image size' ) }
onChange={ ( newSize ) =>
setAttributes( {
size: newSize,
} )
}
min={ avatar.minSize }
max={ avatar.maxSize }
initialPosition={ attributes?.size }
value={ attributes?.size }
/>
<ToggleControl
label={ __( 'Link to user profile' ) }
onChange={ () =>
setAttributes( { isLink: ! attributes.isLink } )
}
checked={ attributes.isLink }
/>
{ attributes.isLink && (
<ToggleControl
label={ __( 'Open in new tab' ) }
onChange={ ( value ) =>
setAttributes( {
linkTarget: value ? '_blank' : '_self',
} )
}
checked={ attributes.linkTarget === '_blank' }
/>
) }
{ selectUser && (
<UserControl
value={ attributes?.userId }
onChange={ ( value ) => {
setAttributes( {
userId: value,
} );
} }
/>
) }
</PanelBody>
</InspectorControls>
);
const ResizableAvatar = ( {
setAttributes,
attributes,
avatar,
blockProps,
isSelected,
} ) => {
const borderProps = useBorderProps( attributes );
const doubledSizedSrc = addQueryArgs(
removeQueryArgs( avatar?.src, [ 's' ] ),
{
s: attributes?.size * 2,
}
);
return (
<div { ...blockProps }>
<ResizableBox
size={ {
width: attributes.size,
height: attributes.size,
} }
showHandle={ isSelected }
onResizeStop={ ( event, direction, elt, delta ) => {
setAttributes( {
size: parseInt(
attributes.size + ( delta.height || delta.width ),
10
),
} );
} }
lockAspectRatio
enable={ {
top: false,
right: ! isRTL(),
bottom: true,
left: isRTL(),
} }
minWidth={ avatar.minSize }
maxWidth={ avatar.maxSize }
>
<img
src={ doubledSizedSrc }
alt={ avatar.alt }
{ ...borderProps }
className={ classnames(
'avatar',
'avatar-' + attributes.size,
'photo',
'wp-block-avatar__image',
borderProps.className
) }
style={ {
...borderProps.style, // Border radius, width and style.
} }
/>
</ResizableBox>
</div>
);
};
const CommentEdit = ( { attributes, context, setAttributes, isSelected } ) => {
const { commentId } = context;
const blockProps = useBlockProps();
const avatar = useCommentAvatar( { commentId } );
return (
<>
<AvatarInspectorControls
avatar={ avatar }
setAttributes={ setAttributes }
attributes={ attributes }
selectUser={ false }
/>
{ attributes.isLink ? (
<a
href="#avatar-pseudo-link"
className="wp-block-avatar__link"
onClick={ ( event ) => event.preventDefault() }
>
<ResizableAvatar
attributes={ attributes }
avatar={ avatar }
blockProps={ blockProps }
isSelected={ isSelected }
setAttributes={ setAttributes }
/>
</a>
) : (
<ResizableAvatar
attributes={ attributes }
avatar={ avatar }
blockProps={ blockProps }
isSelected={ isSelected }
setAttributes={ setAttributes }
/>
) }
</>
);
};
const UserEdit = ( { attributes, context, setAttributes, isSelected } ) => {
const { postId, postType } = context;
const avatar = useUserAvatar( {
userId: attributes?.userId,
postId,
postType,
} );
const blockProps = useBlockProps();
return (
<>
<AvatarInspectorControls
selectUser={ true }
attributes={ attributes }
avatar={ avatar }
setAttributes={ setAttributes }
/>
<div>
{ attributes.isLink ? (
<a
href="#avatar-pseudo-link"
className="wp-block-avatar__link"
onClick={ ( event ) => event.preventDefault() }
>
<ResizableAvatar
attributes={ attributes }
avatar={ avatar }
blockProps={ blockProps }
isSelected={ isSelected }
setAttributes={ setAttributes }
/>
</a>
) : (
<ResizableAvatar
attributes={ attributes }
avatar={ avatar }
blockProps={ blockProps }
isSelected={ isSelected }
setAttributes={ setAttributes }
/>
) }
</div>
</>
);
};
export default function Edit( props ) {
// Don't show the Comment Edit controls if we have a comment ID set, or if we're in the Site Editor (where it is `null`).
if ( props?.context?.commentId || props?.context?.commentId === null ) {
return <CommentEdit { ...props } />;
}
return <UserEdit { ...props } />;
}