GrowiSubNavigation.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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?: any,
  22. }
  23. export const GrowiSubNavigation = (props: Props): JSX.Element => {
  24. const { data: editorMode } = useEditorMode();
  25. const {
  26. page,
  27. showDrawerToggler, showTagLabel, showPageAuthors,
  28. isGuestUser, isDrawerMode, isCompactMode,
  29. tags, tagsUpdatedHandler,
  30. controls: Controls,
  31. } = props;
  32. const {
  33. _id: pageId, path, creator, lastUpdateUser,
  34. createdAt, updatedAt,
  35. } = page;
  36. const isViewMode = editorMode === EditorMode.View;
  37. const isEditorMode = !isViewMode;
  38. if (path == null) {
  39. return <></>;
  40. }
  41. return (
  42. <div className={`grw-subnav container-fluid d-flex align-items-center justify-content-between ${isCompactMode ? 'grw-subnav-compact d-print-none' : ''}`}>
  43. {/* Left side */}
  44. <div className="d-flex grw-subnav-left-side">
  45. { showDrawerToggler && isDrawerMode && (
  46. <div className={`d-none d-md-flex align-items-center ${isEditorMode ? 'mr-2 pr-2' : 'border-right mr-4 pr-4'}`}>
  47. <DrawerToggler />
  48. </div>
  49. ) }
  50. <div className="grw-path-nav-container">
  51. { showTagLabel && !isCompactMode && (
  52. <div className="grw-taglabels-container">
  53. <TagLabels tags={tags} isGuestUser={isGuestUser ?? false} tagsUpdateInvoked={tagsUpdatedHandler} />
  54. </div>
  55. ) }
  56. <PagePathNav pageId={pageId} pagePath={path} isSingleLineMode={isEditorMode} isCompactMode={isCompactMode} />
  57. </div>
  58. </div>
  59. {/* Right side */}
  60. <div className="d-flex">
  61. <div>
  62. { Controls && <Controls></Controls> }
  63. </div>
  64. {/* Page Authors */}
  65. { (showPageAuthors && !isCompactMode) && (
  66. <ul className="authors text-nowrap border-left d-none d-lg-block d-edit-none py-2 pl-4 mb-0 ml-3">
  67. <li className="pb-1">
  68. <AuthorInfo user={creator as IUser} date={createdAt} locate="subnav" />
  69. </li>
  70. <li className="mt-1 pt-1 border-top">
  71. <AuthorInfo user={lastUpdateUser as IUser} date={updatedAt} mode="update" locate="subnav" />
  72. </li>
  73. </ul>
  74. ) }
  75. </div>
  76. </div>
  77. );
  78. };