@kitconcept/volto-light-theme
Version:
Volto Light Theme by kitconcept
119 lines (110 loc) • 3.24 kB
JSX
// 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);