Breadcrumb.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import React, { useContext } from 'react';
  2. import { Link } from 'react-router-dom';
  3. import { clusterPath } from 'lib/paths';
  4. import { BREADCRUMB_DEFINITIONS } from 'lib/constants';
  5. import { BreadcrumbWrapper } from './Breadcrumb.styled';
  6. import { BreadcrumbContext } from './Breadcrumb.context';
  7. const basePathEntriesLength = clusterPath().split('/').length;
  8. export interface BreadcrumbDefinitions {
  9. [key: string]: string;
  10. }
  11. const Breadcrumb: React.FC = () => {
  12. const breadcrumbContext = useContext(BreadcrumbContext);
  13. const links = React.useMemo(
  14. () => breadcrumbContext.path.slice(basePathEntriesLength),
  15. [breadcrumbContext.path]
  16. );
  17. const getPathPredicate = (index: number) =>
  18. `${breadcrumbContext.link
  19. .split('/')
  20. .slice(0, basePathEntriesLength + index + 1)
  21. .join('/')}`;
  22. if (links.length < 2) {
  23. return null;
  24. }
  25. return (
  26. <BreadcrumbWrapper role="list">
  27. {links.slice(0, links.length - 1).map((link, index) => (
  28. <li key={link}>
  29. <Link to={getPathPredicate(index)}>
  30. {BREADCRUMB_DEFINITIONS[link] || link}
  31. </Link>
  32. </li>
  33. ))}
  34. <li>
  35. <span>{links[links.length - 1]}</span>
  36. </li>
  37. </BreadcrumbWrapper>
  38. );
  39. };
  40. export default Breadcrumb;