PagePathHierarchicalLink.jsx 2.6 KB

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