PageEditorModeManager.jsx 4.3 KB

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