CodeMirrorEditorMain.tsx 2.1 KB

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