@plone/volto
Version:
Volto
96 lines (87 loc) • 3.02 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, useIntl } from 'react-intl';
import cx from 'classnames';
import { Message } from 'semantic-ui-react';
import LeadImageSidebar from '@plone/volto/components/manage/Blocks/LeadImage/LeadImageSidebar';
import SidebarPortal from '@plone/volto/components/manage/Sidebar/SidebarPortal';
import config from '@plone/volto/registry';
import imageBlockSVG from '@plone/volto/components/manage/Blocks/Image/block-image.svg';
const messages = defineMessages({
ImageBlockInputPlaceholder: {
id: "Upload a lead image in the 'Lead Image' content field.",
defaultMessage: "Upload a lead image in the 'Lead Image' content field.",
},
});
const Edit = (props) => {
const intl = useIntl();
const { data, properties, selected } = props;
const placeholder = () =>
data.placeholder || intl.formatMessage(messages.ImageBlockInputPlaceholder);
const Image = config.getComponent({ name: 'Image' }).component;
const hasImage = !!properties.image;
const hasImageData = hasImage && !!properties.image.data;
const className = cx('responsive', { 'full-image': data.align === 'full' });
const altText = data.image_caption || properties.image_caption || '';
return (
<div
className={cx(
'block image align',
{
center: !Boolean(data.align),
},
data.align,
)}
>
{!hasImage && (
<Message>
<center>
<Image src={imageBlockSVG} alt="" />
<div className="message-text">{placeholder}</div>
</center>
</Message>
)}
{hasImage && hasImageData && (
<Image
className={className}
src={`data:${properties.image['content-type']};base64,${properties.image.data}`}
width={properties.image.width}
height={properties.image.height}
alt={altText}
style={{
aspectRatio: `${properties.image.width}/${properties.image.height}`,
}}
/>
)}
{hasImage && !hasImageData && (
<Image
className={className}
item={properties}
imageField="image"
sizes={(() => {
return data.align === 'full' || data.align === 'center'
? '100vw'
: data.align === 'left' || data.align === 'right'
? '50vw'
: undefined;
})()}
alt={altText}
/>
)}
<SidebarPortal selected={selected}>
<LeadImageSidebar {...props} />
</SidebarPortal>
</div>
);
};
export default Edit;
Edit.propTypes = {
properties: PropTypes.objectOf(PropTypes.any).isRequired,
selected: PropTypes.bool.isRequired,
block: PropTypes.string.isRequired,
index: PropTypes.number.isRequired,
data: PropTypes.objectOf(PropTypes.any).isRequired,
pathname: PropTypes.string.isRequired,
onChangeBlock: PropTypes.func.isRequired,
openObjectBrowser: PropTypes.func.isRequired,
};