CodeMirrorEditorMain.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. onEditorsUpdated?: (userList: IUserHasId[]) => void,
  21. }
  22. export const CodeMirrorEditorMain = (props: Props): JSX.Element => {
  23. const {
  24. acceptedUploadFileType,
  25. indentSize, user, pageId, initialValue,
  26. editorTheme, editorKeymap,
  27. onSave, onChange, onUpload, onScroll, onOpenEditor, onEditorsUpdated,
  28. } = props;
  29. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.MAIN);
  30. useCollaborativeEditorMode(user, pageId, initialValue, onOpenEditor, onEditorsUpdated, codeMirrorEditor);
  31. // setup additional extensions
  32. useEffect(() => {
  33. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  34. }, [codeMirrorEditor]);
  35. // set handler to save with shortcut key
  36. useEffect(() => {
  37. if (onSave == null) {
  38. return;
  39. }
  40. const extension = keymap.of([
  41. {
  42. key: 'Mod-s',
  43. preventDefault: true,
  44. run: () => {
  45. const doc = codeMirrorEditor?.getDoc();
  46. if (doc != null) {
  47. onSave();
  48. }
  49. return true;
  50. },
  51. },
  52. ]);
  53. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(extension);
  54. return cleanupFunction;
  55. }, [codeMirrorEditor, onSave]);
  56. return (
  57. <CodeMirrorEditor
  58. editorKey={GlobalCodeMirrorEditorKey.MAIN}
  59. onChange={onChange}
  60. onSave={onSave}
  61. onUpload={onUpload}
  62. onScroll={onScroll}
  63. acceptedUploadFileType={acceptedUploadFileType}
  64. indentSize={indentSize}
  65. editorTheme={editorTheme}
  66. editorKeymap={editorKeymap}
  67. />
  68. );
  69. };