CodeMirrorEditorMain.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 { useCodeMirrorEditorIsolated } from '../stores';
  6. import { CodeMirrorEditor } from '.';
  7. const additionalExtensions: Extension[] = [
  8. scrollPastEnd(),
  9. ];
  10. type Props = {
  11. onChange?: (value: string) => void,
  12. onSave?: () => void,
  13. indentSize?: number,
  14. }
  15. export const CodeMirrorEditorMain = (props: Props): JSX.Element => {
  16. const {
  17. onSave, onChange, indentSize,
  18. } = props;
  19. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.MAIN);
  20. // setup additional extensions
  21. useEffect(() => {
  22. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  23. }, [codeMirrorEditor]);
  24. // set handler to save with shortcut key
  25. useEffect(() => {
  26. if (onSave == null) {
  27. return;
  28. }
  29. const extension = keymap.of([
  30. {
  31. key: 'Mod-s',
  32. preventDefault: true,
  33. run: () => {
  34. const doc = codeMirrorEditor?.getDoc();
  35. if (doc != null) {
  36. onSave();
  37. }
  38. return true;
  39. },
  40. },
  41. ]);
  42. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(extension);
  43. return cleanupFunction;
  44. }, [codeMirrorEditor, onSave]);
  45. return (
  46. <CodeMirrorEditor
  47. editorKey={GlobalCodeMirrorEditorKey.MAIN}
  48. onChange={onChange}
  49. indentSize={indentSize}
  50. />
  51. );
  52. };