UNPKG

@kitconcept/volto-light-theme

Version:
119 lines (110 loc) 3.24 kB
// SemanticUI-free pre-@plone/components import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { compose } from 'redux'; import { Link } from 'react-router-dom'; import { defineMessages, injectIntl } from 'react-intl'; import { Container } from '@plone/components'; import Icon from '@plone/volto/components/theme/Icon/Icon'; import { getBreadcrumbs } from '@plone/volto/actions/breadcrumbs/breadcrumbs'; import { getBaseUrl } from '@plone/volto/helpers/Url/Url'; import { hasApiExpander } from '@plone/volto/helpers/Utils/Utils'; import homeSVG from '@plone/volto/icons/home.svg'; const messages = defineMessages({ home: { id: 'Home', defaultMessage: 'Home', }, breadcrumbs: { id: 'Breadcrumbs', defaultMessage: 'Breadcrumbs', }, }); /** * Breadcrumbs container class. */ export class BreadcrumbsComponent extends Component { /** * Property types. * @property {Object} propTypes Property types. * @static */ static propTypes = { getBreadcrumbs: PropTypes.func.isRequired, pathname: PropTypes.string.isRequired, root: PropTypes.string, items: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string, url: PropTypes.string, }), ).isRequired, }; componentDidMount() { if (!hasApiExpander('breadcrumbs', getBaseUrl(this.props.pathname))) { this.props.getBreadcrumbs(getBaseUrl(this.props.pathname)); } } /** * Component will receive props * @method componentWillReceiveProps * @param {Object} nextProps Next properties * @returns {undefined} */ UNSAFE_componentWillReceiveProps(nextProps) { if (nextProps.pathname !== this.props.pathname) { if (!hasApiExpander('breadcrumbs', getBaseUrl(this.props.pathname))) { this.props.getBreadcrumbs(getBaseUrl(nextProps.pathname)); } } } /** * Render method. * @method render * @returns {string} Markup for the component. */ render() { return ( <div role="navigation" aria-label={this.props.intl.formatMessage(messages.breadcrumbs)} className="breadcrumbs" > <Container layout> <div className="breadcrumb"> <Link to={this.props.root || '/'} className="home" title={this.props.intl.formatMessage(messages.home)} > <Icon name={homeSVG} size="25px" /> </Link> {this.props.items.map((item, index, items) => [ <div className="divider" key={`divider-${item.url}`} />, index < items.length - 1 ? ( <Link key={item.url} to={item.url} className="section"> {item.title} </Link> ) : ( <div className="section active" key={item.url}> {item.title} </div> ), ])} </div> </Container> </div> ); } } export default compose( injectIntl, connect( (state) => ({ items: state.breadcrumbs.items, root: state.breadcrumbs.root, }), { getBreadcrumbs }, ), )(BreadcrumbsComponent);