DisplaySwitcher.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import React from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { useHashChangedEffect } from '~/client/services/side-effects/hash-changed';
  4. import { usePageUpdatedEffect } from '~/client/services/side-effects/page-updated';
  5. import { useIsEditable } from '~/stores/context';
  6. import { useIsLatestRevision } from '~/stores/page';
  7. import { EditorMode, useEditorMode } from '~/stores/ui';
  8. import { LazyRenderer } from '../Common/LazyRenderer';
  9. const PageEditor = dynamic(() => import('../PageEditor'), { ssr: false });
  10. const PageEditorReadOnly = dynamic(() => import('../PageEditor/PageEditorReadOnly').then(mod => mod.PageEditorReadOnly), { ssr: false });
  11. type Props = {
  12. pageView: JSX.Element,
  13. }
  14. export const DisplaySwitcher = (props: Props): JSX.Element => {
  15. const { pageView } = props;
  16. const { data: editorMode = EditorMode.View } = useEditorMode();
  17. const { data: isEditable } = useIsEditable();
  18. const { data: isLatestRevision } = useIsLatestRevision();
  19. usePageUpdatedEffect();
  20. useHashChangedEffect();
  21. const isViewMode = editorMode === EditorMode.View;
  22. return (
  23. <>
  24. { isViewMode && pageView }
  25. <LazyRenderer shouldRender={isEditable === true && editorMode === EditorMode.Editor}>
  26. { isLatestRevision
  27. ? <PageEditor />
  28. : <PageEditorReadOnly />
  29. }
  30. </LazyRenderer>
  31. </>
  32. );
  33. };