GrowiSubNavigation.tsx 3.0 KB

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