PageEditorModeManager.jsx 4.2 KB

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