UNPKG

@plone/volto

Version:
133 lines (126 loc) 3.88 kB
/** * Footer component. * @module components/theme/Footer/Footer */ import React from 'react'; import { Container, List, Segment } from 'semantic-ui-react'; import map from 'lodash/map'; import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { useSelector, shallowEqual } from 'react-redux'; import UniversalLink from '@plone/volto/components/manage/UniversalLink/UniversalLink'; import { flattenToAppURL, addAppURL } from '@plone/volto/helpers/Url/Url'; const messages = defineMessages({ copyright: { id: 'Copyright', defaultMessage: 'Copyright', }, }); /** * Component to display the footer. * @function Footer * @param {Object} intl Intl object * @returns {string} Markup of the component */ const Footer = ({ intl }) => { const { siteActions = [] } = useSelector( (state) => ({ siteActions: state.actions?.actions?.site_actions, }), shallowEqual, ); return ( <Segment role="contentinfo" vertical padded inverted color="grey" textAlign="center" id="footer" aria-label="Footer" tabIndex="-1" > <Container> <Segment basic inverted color="grey" className="discreet"> <FormattedMessage id="The {plonecms} is {copyright} 2000-{current_year} by the {plonefoundation} and friends." defaultMessage="The {plonecms} is {copyright} 2000-{current_year} by the {plonefoundation} and friends." values={{ plonecms: ( <FormattedMessage id="Plone{reg} Open Source CMS/WCM" defaultMessage="Plone{reg} Open Source CMS/WCM" values={{ reg: <sup>®</sup> }} /> ), copyright: ( <abbr title={intl.formatMessage(messages.copyright)}>©</abbr> ), current_year: new Date().getFullYear(), plonefoundation: ( <a className="item" href="http://plone.org/foundation"> <FormattedMessage id="Plone Foundation" defaultMessage="Plone Foundation" /> </a> ), }} />{' '} <FormattedMessage id="Distributed under the {license}." defaultMessage="Distributed under the {license}." values={{ license: ( <a className="item" href="http://creativecommons.org/licenses/GPL/2.0/" > <FormattedMessage id="GNU GPL license" defaultMessage="GNU GPL license" /> </a> ), }} /> </Segment> <List horizontal inverted> {siteActions?.length ? map(siteActions, (item) => ( <div role="listitem" className="item" key={item.id}> <UniversalLink className="item" href={ item.url ? flattenToAppURL(item.url) : addAppURL(item.id) } > {item?.title} </UniversalLink> </div> )) : null} <div role="listitem" className="item"> <a className="item" href="https://plone.org"> <FormattedMessage id="Powered by Plone & Python" defaultMessage="Powered by Plone & Python" /> </a> </div> </List> </Container> </Segment> ); }; /** * Property types. * @property {Object} propTypes Property types. * @static */ Footer.propTypes = { /** * i18n object */ }; export default injectIntl(Footer);