CodeMirrorEditorMain.tsx 1.9 KB

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