AuthorInfo.jsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { format } from 'date-fns';
  4. import { UserPicture } from '@growi/ui';
  5. import { pagePathUtils } from '@growi/core';
  6. const { userPageRoot } = pagePathUtils;
  7. const formatType = 'yyyy/MM/dd HH:mm';
  8. const AuthorInfo = (props) => {
  9. const {
  10. mode, user, date, locate,
  11. } = props;
  12. const infoLabelForSubNav = mode === 'create'
  13. ? 'Created by'
  14. : 'Updated by';
  15. const nullinfoLabelForFooter = mode === 'create'
  16. ? 'Created by'
  17. : 'Updated by';
  18. const infoLabelForFooter = mode === 'create'
  19. ? 'Created at'
  20. : 'Last revision posted at';
  21. const userLabel = user != null
  22. ? <a href={userPageRoot(user)}>{user.name}</a>
  23. : <i>Unknown</i>;
  24. if (locate === 'footer') {
  25. try {
  26. return <p>{infoLabelForFooter} {format(new Date(date), formatType)} by <UserPicture user={user} size="sm" /> {userLabel}</p>;
  27. }
  28. catch (err) {
  29. if (err instanceof RangeError) {
  30. return <p>{nullinfoLabelForFooter} <UserPicture user={user} size="sm" /> {userLabel}</p>;
  31. }
  32. return <></>;
  33. }
  34. }
  35. const renderParsedDate = () => {
  36. try {
  37. return format(new Date(date), formatType);
  38. }
  39. catch (err) {
  40. return '';
  41. }
  42. };
  43. return (
  44. <div className="d-flex align-items-center">
  45. <div className="mr-2">
  46. <UserPicture user={user} size="sm" />
  47. </div>
  48. <div>
  49. <div>{infoLabelForSubNav} {userLabel}</div>
  50. <div className="text-muted text-date">
  51. {renderParsedDate()}
  52. </div>
  53. </div>
  54. </div>
  55. );
  56. };
  57. AuthorInfo.propTypes = {
  58. date: PropTypes.instanceOf(Date),
  59. user: PropTypes.object,
  60. mode: PropTypes.oneOf(['create', 'update']),
  61. locate: PropTypes.oneOf(['subnav', 'footer']),
  62. };
  63. AuthorInfo.defaultProps = {
  64. mode: 'create',
  65. locate: 'subnav',
  66. };
  67. export default AuthorInfo;