PagePathHierarchicalLink.jsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 {
  7. linkedPagePath, basePath, isInTrash, shouldDangerouslySetInnerHTML,
  8. } = props;
  9. // render root element
  10. if (linkedPagePath.isRoot) {
  11. if (basePath != null) {
  12. return null;
  13. }
  14. return isInTrash
  15. ? (
  16. <>
  17. <span className="path-segment">
  18. <a href="/trash"><i className="icon-trash"></i></a>
  19. </span>
  20. <span className="separator"><a href="/">/</a></span>
  21. </>
  22. )
  23. : (
  24. <>
  25. <span className="path-segment">
  26. <a href="/">
  27. <i className="icon-home"></i>
  28. <span className="separator">/</span>
  29. </a>
  30. </span>
  31. </>
  32. );
  33. }
  34. const isParentExists = linkedPagePath.parent != null;
  35. const isParentRoot = linkedPagePath.parent?.isRoot;
  36. const isSeparatorRequired = isParentExists && !isParentRoot;
  37. const href = encodeURI(urljoin(basePath || '/', linkedPagePath.href));
  38. // eslint-disable-next-line react/prop-types
  39. const RootElm = ({ children }) => {
  40. return props.isInnerElem
  41. ? <>{children}</>
  42. : <span className="grw-page-path-hierarchical-link text-break">{children}</span>;
  43. };
  44. return (
  45. <RootElm>
  46. { isParentExists && (
  47. <PagePathHierarchicalLink
  48. linkedPagePath={linkedPagePath.parent}
  49. basePath={basePath}
  50. isInTrash={isInTrash || linkedPagePath.isInTrash}
  51. isInnerElem
  52. shouldDangerouslySetInnerHTML={shouldDangerouslySetInnerHTML}
  53. />
  54. ) }
  55. { isSeparatorRequired && (
  56. <span className="separator">/</span>
  57. ) }
  58. {
  59. shouldDangerouslySetInnerHTML
  60. ? <a className="page-segment" href={href} dangerouslySetInnerHTML={{ __html: linkedPagePath.pathName }}></a>
  61. : <a className="page-segment" href={href}>{linkedPagePath.pathName}</a>
  62. }
  63. </RootElm>
  64. );
  65. };
  66. PagePathHierarchicalLink.propTypes = {
  67. linkedPagePath: PropTypes.instanceOf(LinkedPagePath).isRequired,
  68. basePath: PropTypes.string,
  69. isInTrash: PropTypes.bool,
  70. shouldDangerouslySetInnerHTML: PropTypes.bool,
  71. // !!INTERNAL USE ONLY!!
  72. isInnerElem: PropTypes.bool,
  73. };
  74. export default PagePathHierarchicalLink;