CodeMirrorEditorMain.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { useEffect } from 'react';
  2. import { type Extension } from '@codemirror/state';
  3. import { keymap, scrollPastEnd } from '@codemirror/view';
  4. import { GlobalCodeMirrorEditorKey } from '../consts';
  5. import { setDataLine } from '../services/extensions/setDataLine';
  6. import { useCodeMirrorEditorIsolated, useCollaborativeEditorMode } from '../stores';
  7. import { CodeMirrorEditor, CodeMirrorEditorProps } from '.';
  8. const additionalExtensions: Extension[] = [
  9. [
  10. scrollPastEnd(),
  11. setDataLine,
  12. ],
  13. ];
  14. type Props = CodeMirrorEditorProps & {
  15. userName?: string,
  16. pageId?: string,
  17. initialValue?: string,
  18. onOpenEditor?: (markdown: string) => void,
  19. }
  20. export const CodeMirrorEditorMain = (props: Props): JSX.Element => {
  21. const {
  22. userName, pageId, initialValue, onOpenEditor, onSave, ...otherProps
  23. } = props;
  24. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.MAIN);
  25. useCollaborativeEditorMode(userName, pageId, initialValue, onOpenEditor, codeMirrorEditor);
  26. // setup additional extensions
  27. useEffect(() => {
  28. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  29. }, [codeMirrorEditor]);
  30. // set handler to save with shortcut key
  31. useEffect(() => {
  32. if (onSave == null) {
  33. return;
  34. }
  35. const extension = keymap.of([
  36. {
  37. key: 'Mod-s',
  38. preventDefault: true,
  39. run: () => {
  40. const doc = codeMirrorEditor?.getDoc();
  41. if (doc != null) {
  42. onSave();
  43. }
  44. return true;
  45. },
  46. },
  47. ]);
  48. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(extension);
  49. return cleanupFunction;
  50. }, [codeMirrorEditor, onSave]);
  51. return (
  52. <CodeMirrorEditor
  53. editorKey={GlobalCodeMirrorEditorKey.MAIN}
  54. onSave={onSave}
  55. {...otherProps}
  56. />
  57. );
  58. };