PageEditorModeManager.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import React, { type ReactNode, useCallback } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { EditorMode, useIsDeviceSmallerThanMd } from '~/stores/ui';
  4. import styles from './PageEditorModeManager.module.scss';
  5. type PageEditorModeButtonProps = {
  6. currentEditorMode: EditorMode,
  7. editorMode: EditorMode,
  8. icon: ReactNode,
  9. label: ReactNode,
  10. isBtnDisabled?: boolean,
  11. onClick?: (mode: EditorMode) => void,
  12. }
  13. const PageEditorModeButton = React.memo((props: PageEditorModeButtonProps) => {
  14. const {
  15. currentEditorMode, isBtnDisabled, editorMode, icon, label, onClick,
  16. } = props;
  17. const classNames = ['btn btn-outline-primary px-1'];
  18. if (currentEditorMode === editorMode) {
  19. classNames.push('active');
  20. }
  21. if (isBtnDisabled) {
  22. classNames.push('disabled');
  23. }
  24. return (
  25. <button
  26. type="button"
  27. className={classNames.join(' ')}
  28. onClick={() => onClick?.(editorMode)}
  29. data-testid={`${editorMode}-button`}
  30. >
  31. <span className="d-flex flex-column flex-md-row justify-content-center">
  32. <span className="grw-page-editor-mode-manager-icon me-md-1">{icon}</span>
  33. <span className="grw-page-editor-mode-manager-label">{label}</span>
  34. </span>
  35. </button>
  36. );
  37. });
  38. type Props = {
  39. editorMode: EditorMode | undefined,
  40. onPageEditorModeButtonClicked?: (editorMode: EditorMode) => void,
  41. isBtnDisabled?: boolean,
  42. }
  43. export const PageEditorModeManager = (props: Props): JSX.Element => {
  44. const {
  45. editorMode = EditorMode.View,
  46. isBtnDisabled,
  47. onPageEditorModeButtonClicked,
  48. } = props;
  49. const { t } = useTranslation();
  50. const { data: isDeviceSmallerThanMd } = useIsDeviceSmallerThanMd();
  51. const pageEditorModeButtonClickedHandler = useCallback((viewType) => {
  52. if (isBtnDisabled ?? false) {
  53. return;
  54. }
  55. if (onPageEditorModeButtonClicked != null) {
  56. onPageEditorModeButtonClicked(viewType);
  57. }
  58. }, [isBtnDisabled, onPageEditorModeButtonClicked]);
  59. return (
  60. <>
  61. <div
  62. className={`btn-group grw-page-editor-mode-manager ${styles['grw-page-editor-mode-manager']}`}
  63. role="group"
  64. aria-label="page-editor-mode-manager"
  65. id="grw-page-editor-mode-manager"
  66. >
  67. {(!isDeviceSmallerThanMd || editorMode !== EditorMode.View) && (
  68. <PageEditorModeButton
  69. currentEditorMode={editorMode}
  70. editorMode={EditorMode.View}
  71. isBtnDisabled={isBtnDisabled}
  72. onClick={pageEditorModeButtonClickedHandler}
  73. icon={<i className="icon-control-play" />}
  74. label={t('view')}
  75. />
  76. )}
  77. {(!isDeviceSmallerThanMd || editorMode === EditorMode.View) && (
  78. <PageEditorModeButton
  79. currentEditorMode={editorMode}
  80. editorMode={EditorMode.Editor}
  81. isBtnDisabled={isBtnDisabled}
  82. onClick={pageEditorModeButtonClickedHandler}
  83. icon={<i className="icon-note" />}
  84. label={t('Edit')}
  85. />
  86. )}
  87. </div>
  88. </>
  89. );
  90. };