@plone/volto
Version:
Volto
77 lines (71 loc) • 2.13 kB
JSX
/**
* NewsItemView view component.
* @module components/theme/View/NewsItemView
*/
import React from 'react';
import PropTypes from 'prop-types';
import { Container as SemanticContainer } from 'semantic-ui-react';
import { hasBlocksData } from '@plone/volto/helpers/Blocks/Blocks';
import { flattenHTMLToAppURL } from '@plone/volto/helpers/Url/Url';
import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
import config from '@plone/volto/registry';
/**
* NewsItemView view component class.
* @function NewsItemView
* @params {object} content Content object.
* @returns {string} Markup of the component.
*/
const NewsItemView = ({ content }) => {
const Image = config.getComponent({ name: 'Image' }).component;
const Container =
config.getComponent({ name: 'Container' }).component || SemanticContainer;
return hasBlocksData(content) ? (
<Container id="page-document" className="view-wrapper newsitem-view">
<RenderBlocks content={content} />
</Container>
) : (
<Container className="view-wrapper">
{content.title && (
<h1 className="documentFirstHeading">
{content.title}
{content.subtitle && ` - ${content.subtitle}`}
</h1>
)}
{content.description && (
<p className="documentDescription">{content.description}</p>
)}
{content.image && (
<Image
className="documentImage ui right floated image"
alt={content.title}
title={content.title}
item={content}
imageField="image"
responsive={true}
/>
)}
{content.text && (
<div
dangerouslySetInnerHTML={{
__html: flattenHTMLToAppURL(content.text.data),
}}
/>
)}
</Container>
);
};
/**
* Property types.
* @property {Object} propTypes Property types.
* @static
*/
NewsItemView.propTypes = {
content: PropTypes.shape({
title: PropTypes.string,
description: PropTypes.string,
text: PropTypes.shape({
data: PropTypes.string,
}),
}).isRequired,
};
export default NewsItemView;