PageEditorModeManager.jsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import React, { useCallback } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import { UncontrolledTooltip } from 'reactstrap';
  5. import { useCurrentUser, useHackmdUri } from '~/stores/context';
  6. import { EditorMode, useIsDeviceSmallerThanMd } from '~/stores/ui';
  7. import styles from './PageEditorModeManager.module.scss';
  8. /* eslint-disable react/prop-types */
  9. const PageEditorModeButtonWrapper = React.memo(({
  10. editorMode, isBtnDisabled, onClick, targetMode, icon, label, id,
  11. }) => {
  12. const classNames = [`btn btn-outline-primary ${targetMode}-button px-1`];
  13. if (editorMode === targetMode) {
  14. classNames.push('active');
  15. }
  16. if (isBtnDisabled) {
  17. classNames.push('disabled');
  18. }
  19. return (
  20. <button
  21. type="button"
  22. className={classNames.join(' ')}
  23. onClick={() => { onClick(targetMode) }}
  24. id={id}
  25. data-testid={`${targetMode}-button`}
  26. >
  27. <span className="d-flex flex-column flex-md-row justify-content-center">
  28. <span className="grw-page-editor-mode-manager-icon mr-md-1">{icon}</span>
  29. <span className="grw-page-editor-mode-manager-label">{label}</span>
  30. </span>
  31. </button>
  32. );
  33. });
  34. /* eslint-enable react/prop-types */
  35. PageEditorModeButtonWrapper.displayName = 'PageEditorModeButtonWrapper';
  36. function PageEditorModeManager(props) {
  37. const {
  38. editorMode, onPageEditorModeButtonClicked, isBtnDisabled,
  39. } = props;
  40. const { t } = useTranslation();
  41. const { data: isDeviceSmallerThanMd } = useIsDeviceSmallerThanMd();
  42. const { data: currentUser } = useCurrentUser();
  43. const { data: hackmdUri } = useHackmdUri();
  44. const isAdmin = currentUser?.admin;
  45. const isHackmdEnabled = hackmdUri != null;
  46. const showHackmdBtn = isHackmdEnabled || isAdmin;
  47. const pageEditorModeButtonClickedHandler = useCallback((viewType) => {
  48. if (isBtnDisabled) {
  49. return;
  50. }
  51. if (onPageEditorModeButtonClicked != null) {
  52. onPageEditorModeButtonClicked(viewType);
  53. }
  54. }, [isBtnDisabled, onPageEditorModeButtonClicked]);
  55. return (
  56. <>
  57. <div
  58. className={`btn-group grw-page-editor-mode-manager ${styles['grw-page-editor-mode-manager']}`}
  59. role="group"
  60. aria-label="page-editor-mode-manager"
  61. id="grw-page-editor-mode-manager"
  62. >
  63. {(!isDeviceSmallerThanMd || editorMode !== EditorMode.View) && (
  64. <PageEditorModeButtonWrapper
  65. editorMode={editorMode}
  66. isBtnDisabled={isBtnDisabled}
  67. onClick={pageEditorModeButtonClickedHandler}
  68. targetMode={EditorMode.View}
  69. icon={<i className="icon-control-play" />}
  70. label={t('view')}
  71. />
  72. )}
  73. {(!isDeviceSmallerThanMd || editorMode === EditorMode.View) && (
  74. <PageEditorModeButtonWrapper
  75. editorMode={editorMode}
  76. isBtnDisabled={isBtnDisabled}
  77. onClick={pageEditorModeButtonClickedHandler}
  78. targetMode={EditorMode.Editor}
  79. icon={<i className="icon-note" />}
  80. label={t('Edit')}
  81. />
  82. )}
  83. {(!isDeviceSmallerThanMd || editorMode === EditorMode.View) && showHackmdBtn && (
  84. <>
  85. <PageEditorModeButtonWrapper
  86. editorMode={editorMode}
  87. isBtnDisabled={isBtnDisabled || !isHackmdEnabled}
  88. onClick={isHackmdEnabled ? pageEditorModeButtonClickedHandler : undefined}
  89. targetMode={EditorMode.HackMD}
  90. icon={<i className="fa fa-file-text-o" />}
  91. label={t('hackmd.hack_md')}
  92. id="grw-page-editor-mode-manager-hackmd-button"
  93. />
  94. { !isHackmdEnabled && (
  95. <UncontrolledTooltip placement="top" target="grw-page-editor-mode-manager-hackmd-button" fade={false}>
  96. {t('hackmd.not_set_up')}
  97. </UncontrolledTooltip>
  98. )}
  99. </>
  100. )}
  101. </div>
  102. {isBtnDisabled && (
  103. <UncontrolledTooltip placement="top" target="grw-page-editor-mode-manager" fade={false}>
  104. {t('Not available for guest')}
  105. </UncontrolledTooltip>
  106. )}
  107. </>
  108. );
  109. }
  110. PageEditorModeManager.propTypes = {
  111. onPageEditorModeButtonClicked: PropTypes.func,
  112. isBtnDisabled: PropTypes.bool,
  113. editorMode: PropTypes.string,
  114. };
  115. PageEditorModeManager.defaultProps = {
  116. isBtnDisabled: false,
  117. };
  118. export default PageEditorModeManager;