DisplaySwitcher.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import React from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { useHackmdDraftUpdatedEffect } from '~/client/services/side-effects/hackmd-draft-updated';
  4. import { useHashChangedEffect } from '~/client/services/side-effects/hash-changed';
  5. import { usePageUpdatedEffect } from '~/client/services/side-effects/page-updated';
  6. import { useIsEditable } from '~/stores/context';
  7. import { EditorMode, useEditorMode } from '~/stores/ui';
  8. import { LazyRenderer } from '../Common/LazyRenderer';
  9. const PageEditor = dynamic(() => import('../PageEditor'), { ssr: false });
  10. const PageEditorByHackmd = dynamic(() => import('../PageEditorByHackmd').then(mod => mod.PageEditorByHackmd), { ssr: false });
  11. const EditorNavbarBottom = dynamic(() => import('../PageEditor/EditorNavbarBottom'), { ssr: false });
  12. type Props = {
  13. pageView: JSX.Element,
  14. }
  15. export const DisplaySwitcher = (props: Props): JSX.Element => {
  16. const { pageView } = props;
  17. const { data: editorMode = EditorMode.View } = useEditorMode();
  18. const { data: isEditable } = useIsEditable();
  19. usePageUpdatedEffect();
  20. useHashChangedEffect();
  21. useHackmdDraftUpdatedEffect();
  22. const isViewMode = editorMode === EditorMode.View;
  23. return (
  24. <>
  25. { isViewMode && pageView }
  26. <LazyRenderer shouldRender={isEditable === true && editorMode === EditorMode.Editor}>
  27. <div data-testid="page-editor" id="page-editor" className="editor-root">
  28. <PageEditor />
  29. </div>
  30. </LazyRenderer>
  31. <LazyRenderer shouldRender={isEditable === true && editorMode === EditorMode.HackMD}>
  32. <div id="page-editor-with-hackmd" className="editor-root">
  33. <PageEditorByHackmd />
  34. </div>
  35. </LazyRenderer>
  36. { isEditable && !isViewMode && <EditorNavbarBottom /> }
  37. </>
  38. );
  39. };