GrowiSubNavigation.tsx 3.2 KB

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