UNPKG

design-comuni-plone-theme

Version:
115 lines (109 loc) 3.39 kB
import { defineMessages, useIntl } from 'react-intl'; import { useDispatch, useSelector } from 'react-redux'; import React, { useEffect } from 'react'; import { searchContent, resetSearchContent } from '@plone/volto/actions'; import { flattenToAppURL } from '@plone/volto/helpers'; import PropTypes from 'prop-types'; import { contentHasImage } from 'design-comuni-plone-theme/helpers'; import { UniversalLink } from '@plone/volto/components'; import config from '@plone/volto/registry'; const messages = defineMessages({ sponsors: { id: 'sponsors', defaultMessage: 'Sponsor', }, }); /** * Sponsor view component class. * @function Sponsor * @params {object} content Content object. * @params {string} folder name where to find images. * @returns {string} Markup of the component. */ const Sponsor = ({ item }) => { const Image = config.getComponent({ name: 'Image' }).component; const showImage = contentHasImage(item); return item ? ( <div className="sponsor-item"> <UniversalLink href={item.remoteUrl}> {showImage ? ( <Image item={item} sizes="600px" loading="lazy" className="img-fluid" alt={item.image.filename ?? item.title} /> ) : ( item.title )} </UniversalLink> </div> ) : null; }; /** * Sponsors view component class (used in EventSponsors) * @function Sponsors * @params {object} content Content object. * @params {string} folder name where to find images. * @returns {string} Markup of the component. */ const Sponsors = ({ content, folder_name, title }) => { const intl = useIntl(); const url = `${flattenToAppURL(content['@id'])}/${folder_name}`; const searchResults = useSelector((state) => state.search.subrequests); const dispatch = useDispatch(); useEffect(() => { if (content?.items.some((e) => e.id === folder_name)) { dispatch( searchContent( url, { 'path.depth': 1, sort_on: 'getObjPositionInParent', metadata_fields: '_all', }, folder_name, ), ); } return () => { dispatch(resetSearchContent(folder_name)); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [url]); const sponsors = searchResults?.[folder_name]?.items || []; const sponsors_no_logos = sponsors.filter((sponsor) => !sponsor.image); const sponsors_logos = sponsors.filter((sponsor) => sponsor.image); return sponsors?.length > 0 ? ( <> {title ? ( <strong>{`${title}:`}</strong> ) : ( <strong>{`${intl.formatMessage(messages.sponsors)}:`}</strong> )} <div className="sponsor-wrapper"> {sponsors_logos.length > 0 && ( <div className="sponsor-logos"> {sponsors_logos.map((item, i) => ( <Sponsor key={item['@id']} item={item} /> ))} </div> )} {sponsors_no_logos.length > 0 && ( <div className="sponsor-no-logos"> {sponsors_no_logos.map((item, i) => ( <Sponsor key={item['@id']} item={item} /> ))} </div> )} </div> </> ) : null; }; Sponsors.propTypes = { content: PropTypes.object, folder_name: PropTypes.string, title: PropTypes.string, }; export default Sponsors;