GrowiSubNavigation.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React from 'react';
  2. import dynamic from 'next/dynamic';
  3. import {
  4. EditorMode, useEditorMode,
  5. } from '~/stores/ui';
  6. import { TagLabelsSkeleton } from '../Page/TagLabels';
  7. import PagePathNav from '../PagePathNav';
  8. import DrawerToggler from './DrawerToggler';
  9. import styles from './GrowiSubNavigation.module.scss';
  10. const TagLabels = dynamic(() => import('../Page/TagLabels').then(mod => mod.TagLabels), {
  11. ssr: false,
  12. loading: TagLabelsSkeleton,
  13. });
  14. export type GrowiSubNavigationProps = {
  15. pagePath?: string,
  16. pageId?: string,
  17. isNotFound?: boolean,
  18. showDrawerToggler?: boolean,
  19. showTagLabel?: boolean,
  20. isTagLabelsDisabled?: boolean,
  21. isDrawerMode?: boolean,
  22. isCompactMode?: boolean,
  23. tags?: string[],
  24. tagsUpdatedHandler?: (newTags: string[]) => Promise<void> | void,
  25. rightComponent?: React.FunctionComponent,
  26. additionalClasses?: string[],
  27. }
  28. export const GrowiSubNavigation = (props: GrowiSubNavigationProps): JSX.Element => {
  29. const { data: editorMode } = useEditorMode();
  30. const {
  31. pageId, pagePath,
  32. showDrawerToggler, showTagLabel,
  33. isTagLabelsDisabled, isDrawerMode, isCompactMode,
  34. tags, tagsUpdatedHandler,
  35. rightComponent: RightComponent,
  36. additionalClasses = [],
  37. } = props;
  38. const isViewMode = editorMode === EditorMode.View;
  39. const isEditorMode = !isViewMode;
  40. const compactModeClasses = isCompactMode ? 'grw-subnav-compact d-print-none' : '';
  41. return (
  42. <div className={`
  43. grw-subnav ${styles['grw-subnav']} d-flex align-items-center justify-content-between
  44. ${additionalClasses.join(' ')}
  45. ${compactModeClasses}`}
  46. >
  47. {/* Left side */}
  48. <div className="d-flex grw-subnav-left-side">
  49. { (showDrawerToggler && isDrawerMode) && (
  50. <div className={`d-none d-md-flex align-items-center ${isEditorMode ? 'mr-2 pr-2' : 'border-right mr-4 pr-4'}`}>
  51. <DrawerToggler />
  52. </div>
  53. ) }
  54. <div className="grw-path-nav-container">
  55. { (showTagLabel && !isCompactMode) && (
  56. <div className="grw-taglabels-container">
  57. { tags != null
  58. ? <TagLabels tags={tags} isTagLabelsDisabled={isTagLabelsDisabled ?? false} tagsUpdateInvoked={tagsUpdatedHandler} />
  59. : <TagLabelsSkeleton />
  60. }
  61. </div>
  62. ) }
  63. { pagePath != null && (
  64. <PagePathNav pageId={pageId} pagePath={pagePath} isSingleLineMode={isEditorMode} isCompactMode={isCompactMode} />
  65. ) }
  66. </div>
  67. </div>
  68. {/* Right side. */}
  69. { RightComponent && (
  70. <RightComponent />
  71. ) }
  72. </div>
  73. );
  74. };