GrowiSubNavigationForUserPage.jsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import LinkedPagePath from '@commons/models/linked-page-path';
  5. import PagePathHierarchicalLink from '@commons/components/PagePathHierarchicalLink';
  6. import { withUnstatedContainers } from '../UnstatedUtils';
  7. import AppContainer from '../../services/AppContainer';
  8. import PageContainer from '../../services/PageContainer';
  9. import RevisionPathControls from '../Page/RevisionPathControls';
  10. import BookmarkButton from '../BookmarkButton';
  11. import UserPicture from '../User/UserPicture';
  12. // eslint-disable-next-line react/prop-types
  13. const PagePathNav = ({ pageId, pagePath }) => {
  14. const linkedPagePath = new LinkedPagePath(pagePath);
  15. const latterLink = <PagePathHierarchicalLink linkedPagePath={linkedPagePath} />;
  16. return (
  17. <div className="grw-page-path-nav">
  18. <span className="d-flex align-items-center flex-wrap">
  19. <h4 className="grw-user-page-path">{latterLink}</h4>
  20. <RevisionPathControls
  21. pageId={pageId}
  22. pagePath={pagePath}
  23. />
  24. </span>
  25. </div>
  26. );
  27. };
  28. const GrowiSubNavigationForUserPage = (props) => {
  29. const pageUser = JSON.parse(document.querySelector('#grw-subnav-for-user-page').getAttribute('data-page-user'));
  30. const { appContainer, pageContainer } = props;
  31. const {
  32. pageId, path,
  33. } = pageContainer.state;
  34. const additionalClassNames = ['grw-subnavbar', 'grw-subnavbar-user-page'];
  35. const layoutType = appContainer.getConfig().layoutType;
  36. if (layoutType === 'growi') {
  37. additionalClassNames.push('py-3');
  38. }
  39. return (
  40. <div className={`px-3 py-3 ${additionalClassNames.join(' ')}`}>
  41. <PagePathNav pageId={pageId} pagePath={path} />
  42. <div className="d-flex align-items-center justify-content-between">
  43. <div className="users-info d-flex align-items-center d-edit-none">
  44. <UserPicture user={pageUser} />
  45. <div className="users-meta">
  46. <h1>
  47. {pageUser.name}
  48. </h1>
  49. <ul className="user-page-meta mt-1 mb-0">
  50. <li className="user-page-username"><i className="icon-user mr-1"></i>{pageUser.username}</li>
  51. <li className="user-page-email">
  52. <i className="icon-envelope mr-1"></i>
  53. {pageUser.isEmailPublished ? pageUser.email : '*****'}
  54. </li>
  55. {pageUser.introduction && <li className="user-page-introduction"><p>{pageUser.introduction}</p></li>}
  56. </ul>
  57. </div>
  58. </div>
  59. <BookmarkButton pageId={pageId} crowi={appContainer} size="lg" />
  60. </div>
  61. </div>
  62. );
  63. };
  64. /**
  65. * Wrapper component for using unstated
  66. */
  67. const GrowiSubNavigationForUserPageWrapper = withUnstatedContainers(GrowiSubNavigationForUserPage, [AppContainer, PageContainer]);
  68. GrowiSubNavigationForUserPage.propTypes = {
  69. t: PropTypes.func.isRequired, // i18next
  70. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  71. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  72. };
  73. export default withTranslation()(GrowiSubNavigationForUserPageWrapper);