AuthorInfo.tsx 1.8 KB

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