GrowiSubNavigation.tsx 3.4 KB

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