PagePathHierarchicalLink.jsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import urljoin from 'url-join';
  4. import LinkedPagePath from '../models/linked-page-path';
  5. const PagePathHierarchicalLink = (props) => {
  6. const { linkedPagePath, basePath, isInTrash } = props;
  7. // render root element
  8. if (linkedPagePath.isRoot) {
  9. if (basePath != null) {
  10. return null;
  11. }
  12. return isInTrash
  13. ? (
  14. <>
  15. <span className="path-segment">
  16. <a href="/trash"><i className="icon-trash"></i></a>
  17. </span>
  18. <span className="separator"><a href="/">/</a></span>
  19. </>
  20. )
  21. : (
  22. <>
  23. <span className="path-segment">
  24. <a href="/">
  25. <i className="icon-home"></i>
  26. <span className="separator">/</span>
  27. </a>
  28. </span>
  29. </>
  30. );
  31. }
  32. const isParentExists = linkedPagePath.parent != null;
  33. const isParentRoot = linkedPagePath.parent?.isRoot;
  34. const isSeparatorRequired = isParentExists && !isParentRoot;
  35. const isParentInTrash = isInTrash || linkedPagePath.isInTrash;
  36. const href = encodeURI(urljoin(basePath || '/', linkedPagePath.href));
  37. return (
  38. <>
  39. { isParentExists && (
  40. <PagePathHierarchicalLink
  41. linkedPagePath={linkedPagePath.parent}
  42. basePath={basePath}
  43. isInTrash={isParentInTrash}
  44. />
  45. ) }
  46. { isSeparatorRequired && (
  47. <span className="separator">/</span>
  48. ) }
  49. <a className="page-segment" href={href}>{linkedPagePath.pathName}</a>
  50. </>
  51. );
  52. };
  53. PagePathHierarchicalLink.propTypes = {
  54. linkedPagePath: PropTypes.instanceOf(LinkedPagePath).isRequired,
  55. basePath: PropTypes.string,
  56. isInTrash: PropTypes.bool,
  57. };
  58. export default PagePathHierarchicalLink;