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 { GlobalCodeMirrorEditorKey, AcceptedUploadFileType } 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. onUpload?: (files: File[]) => void,
  14. acceptedFileType?: AcceptedUploadFileType,
  15. indentSize?: number,
  16. openTabelModal: () => void,
  17. }
  18. export const CodeMirrorEditorMain = (props: Props): JSX.Element => {
  19. const {
  20. onSave, onChange, onUpload, openTabelModal, acceptedFileType, indentSize,
  21. } = props;
  22. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.MAIN);
  23. const acceptedFileTypeNoOpt = acceptedFileType ?? AcceptedUploadFileType.NONE;
  24. // setup additional extensions
  25. useEffect(() => {
  26. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  27. }, [codeMirrorEditor]);
  28. // set handler to save with shortcut key
  29. useEffect(() => {
  30. if (onSave == null) {
  31. return;
  32. }
  33. const extension = keymap.of([
  34. {
  35. key: 'Mod-s',
  36. preventDefault: true,
  37. run: () => {
  38. const doc = codeMirrorEditor?.getDoc();
  39. if (doc != null) {
  40. onSave();
  41. }
  42. return true;
  43. },
  44. },
  45. ]);
  46. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(extension);
  47. return cleanupFunction;
  48. }, [codeMirrorEditor, onSave]);
  49. return (
  50. <CodeMirrorEditor
  51. editorKey={GlobalCodeMirrorEditorKey.MAIN}
  52. onChange={onChange}
  53. onUpload={onUpload}
  54. acceptedFileType={acceptedFileTypeNoOpt}
  55. indentSize={indentSize}
  56. openTabelModal={openTabelModal}
  57. />
  58. );
  59. };