PageEditorModeManager.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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="me-1">{icon}</span>
  32. <span>{label}</span>
  33. </button>
  34. );
  35. });
  36. type Props = {
  37. editorMode: EditorMode | undefined,
  38. onPageEditorModeButtonClicked?: (editorMode: EditorMode) => void,
  39. isBtnDisabled?: boolean,
  40. }
  41. export const PageEditorModeManager = (props: Props): JSX.Element => {
  42. const {
  43. editorMode = EditorMode.View,
  44. isBtnDisabled,
  45. onPageEditorModeButtonClicked,
  46. } = props;
  47. const { t } = useTranslation();
  48. const { data: isDeviceSmallerThanMd } = useIsDeviceSmallerThanMd();
  49. const pageEditorModeButtonClickedHandler = useCallback((viewType) => {
  50. if (isBtnDisabled ?? false) {
  51. return;
  52. }
  53. if (onPageEditorModeButtonClicked != null) {
  54. onPageEditorModeButtonClicked(viewType);
  55. }
  56. }, [isBtnDisabled, onPageEditorModeButtonClicked]);
  57. return (
  58. <>
  59. <div
  60. className={`btn-group grw-page-editor-mode-manager ${styles['grw-page-editor-mode-manager']}`}
  61. role="group"
  62. aria-label="page-editor-mode-manager"
  63. id="grw-page-editor-mode-manager"
  64. >
  65. {(!isDeviceSmallerThanMd || editorMode !== EditorMode.View) && (
  66. <PageEditorModeButton
  67. currentEditorMode={editorMode}
  68. editorMode={EditorMode.View}
  69. isBtnDisabled={isBtnDisabled}
  70. onClick={pageEditorModeButtonClickedHandler}
  71. icon={<i className="icon-control-play" />}
  72. label={t('view')}
  73. />
  74. )}
  75. {(!isDeviceSmallerThanMd || editorMode === EditorMode.View) && (
  76. <PageEditorModeButton
  77. currentEditorMode={editorMode}
  78. editorMode={EditorMode.Editor}
  79. isBtnDisabled={isBtnDisabled}
  80. onClick={pageEditorModeButtonClickedHandler}
  81. icon={<i className="icon-note" />}
  82. label={t('Edit')}
  83. />
  84. )}
  85. </div>
  86. </>
  87. );
  88. };