2
0

GrowiSubNavigation.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { IPageHasId } from '~/interfaces/page';
  4. import { IUser } from '~/interfaces/user';
  5. import {
  6. EditorMode, useEditorMode,
  7. } from '~/stores/ui';
  8. import PagePathNav from '../PagePathNav';
  9. import { Skelton } from '../Skelton';
  10. import DrawerToggler from './DrawerToggler';
  11. import TagLabelsStyles from '../Page/TagLabels.module.scss';
  12. import AuthorInfoStyles from './AuthorInfo.module.scss';
  13. import styles from './GrowiSubNavigation.module.scss';
  14. type Props = {
  15. page: Partial<IPageHasId>,
  16. showDrawerToggler?: boolean,
  17. showTagLabel?: boolean,
  18. showPageAuthors?: boolean,
  19. isGuestUser?: boolean,
  20. isDrawerMode?: boolean,
  21. isCompactMode?: boolean,
  22. tags?: string[],
  23. tagsUpdatedHandler?: (newTags: string[]) => Promise<void> | void,
  24. controls?: React.FunctionComponent,
  25. additionalClasses?: string[],
  26. }
  27. export const GrowiSubNavigation = (props: Props): JSX.Element => {
  28. const TagLabels = dynamic(() => import('../Page/TagLabels'), {
  29. ssr: false,
  30. loading: () => <Skelton additionalClass={`${TagLabelsStyles['grw-tag-labels-skelton']} py-1`} />,
  31. });
  32. const AuthorInfo = dynamic(() => import('./AuthorInfo'), {
  33. ssr: false,
  34. loading: () => <Skelton additionalClass={`${AuthorInfoStyles['grw-author-info-skelton']} py-1`} />,
  35. });
  36. const { data: editorMode } = useEditorMode();
  37. const {
  38. page,
  39. showDrawerToggler, showTagLabel, showPageAuthors,
  40. isGuestUser, isDrawerMode, isCompactMode,
  41. tags, tagsUpdatedHandler,
  42. controls: Controls,
  43. additionalClasses = [],
  44. } = props;
  45. const {
  46. _id: pageId, path, creator, lastUpdateUser,
  47. createdAt, updatedAt,
  48. } = page;
  49. const isViewMode = editorMode === EditorMode.View;
  50. const isEditorMode = !isViewMode;
  51. if (path == null) {
  52. return <></>;
  53. }
  54. return (
  55. <div className={
  56. `grw-subnav ${styles['grw-subnav']} d-flex align-items-center justify-content-between`
  57. + ` ${additionalClasses.join(' ')}`
  58. + ` ${isCompactMode ? 'grw-subnav-compact d-print-none' : ''}`}
  59. >
  60. {/* Left side */}
  61. <div className="d-flex grw-subnav-left-side">
  62. { showDrawerToggler && isDrawerMode && (
  63. <div className={`d-none d-md-flex align-items-center ${isEditorMode ? 'mr-2 pr-2' : 'border-right mr-4 pr-4'}`}>
  64. <DrawerToggler />
  65. </div>
  66. ) }
  67. <div className="grw-path-nav-container">
  68. { showTagLabel && !isCompactMode && (
  69. <div className="grw-taglabels-container">
  70. <TagLabels tags={tags} isGuestUser={isGuestUser ?? false} tagsUpdateInvoked={tagsUpdatedHandler} />
  71. </div>
  72. ) }
  73. <PagePathNav pageId={pageId} pagePath={path} isSingleLineMode={isEditorMode} isCompactMode={isCompactMode} />
  74. </div>
  75. </div>
  76. {/* Right side */}
  77. <div className="d-flex">
  78. { Controls && <Controls></Controls> }
  79. {/* Page Authors */}
  80. { (showPageAuthors && !isCompactMode) && (
  81. <ul className="authors text-nowrap border-left d-none d-lg-block d-edit-none py-2 pl-4 mb-0 ml-3">
  82. <li className="pb-1">
  83. <AuthorInfo user={creator as IUser} date={createdAt} locate="subnav" />
  84. </li>
  85. <li className="mt-1 pt-1 border-top">
  86. <AuthorInfo user={lastUpdateUser as IUser} date={updatedAt} mode="update" locate="subnav" />
  87. </li>
  88. </ul>
  89. ) }
  90. </div>
  91. </div>
  92. );
  93. };