Playground.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import {
  2. useCallback, useEffect, useState,
  3. } from 'react';
  4. import { toast } from 'react-toastify';
  5. import { CodeMirrorEditor } from '..';
  6. import { GlobalCodeMirrorEditorKey } from '../../consts';
  7. import { useCodeMirrorEditorIsolated } from '../../stores';
  8. import { PlaygroundController } from './PlaygroundController';
  9. import { Preview } from './Preview';
  10. export const Playground = (): JSX.Element => {
  11. const [markdownToPreview, setMarkdownToPreview] = useState('');
  12. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.MAIN);
  13. const initialValue = '# header\n';
  14. // initialize
  15. useEffect(() => {
  16. codeMirrorEditor?.initDoc(initialValue);
  17. setMarkdownToPreview(initialValue);
  18. }, [codeMirrorEditor, initialValue]);
  19. // initial caret line
  20. useEffect(() => {
  21. codeMirrorEditor?.setCaretLine();
  22. }, [codeMirrorEditor]);
  23. // set handler to save with shortcut key
  24. const saveHandler = useCallback(() => {
  25. // eslint-disable-next-line no-console
  26. console.log({ doc: codeMirrorEditor?.getDoc() });
  27. toast.success('Saved.', { autoClose: 2000 });
  28. }, [codeMirrorEditor]);
  29. return (
  30. <>
  31. <div className="flex-expand-vert justify-content-center align-items-center bg-dark" style={{ minHeight: '83px' }}>
  32. <div className="text-white">GrowiSubNavigation</div>
  33. </div>
  34. <div className="flex-expand-horiz">
  35. <div className="flex-expand-vert">
  36. <CodeMirrorEditor
  37. onSave={saveHandler}
  38. onChange={setMarkdownToPreview}
  39. />
  40. </div>
  41. <div className="flex-expand-vert d-none d-lg-flex bg-light text-dark border-start border-dark-subtle p-3">
  42. <Preview markdown={markdownToPreview} />
  43. <PlaygroundController />
  44. </div>
  45. </div>
  46. <div className="flex-expand-vert justify-content-center align-items-center bg-dark" style={{ minHeight: '50px' }}>
  47. <div className="text-white">EditorNavbarBottom</div>
  48. </div>
  49. </>
  50. );
  51. };