CodeMirrorEditorComment.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { memo, useEffect } from 'react';
  2. import type { Extension } from '@codemirror/state';
  3. import { keymap, scrollPastEnd } from '@codemirror/view';
  4. import { useCodeMirrorEditorIsolated } from '../stores';
  5. import { CodeMirrorEditor, type CodeMirrorEditorProps } from '.';
  6. import type { GlobalCodeMirrorEditorKey } from 'src/consts';
  7. const additionalExtensions: Extension[] = [
  8. scrollPastEnd(),
  9. ];
  10. type Props = CodeMirrorEditorProps & {
  11. editorKey: string | GlobalCodeMirrorEditorKey,
  12. }
  13. export const CodeMirrorEditorComment = memo((props: Props): JSX.Element => {
  14. const {
  15. editorKey,
  16. onSave, ...rest
  17. } = props;
  18. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(editorKey);
  19. // setup additional extensions
  20. useEffect(() => {
  21. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  22. }, [codeMirrorEditor]);
  23. // set handler to comment with ctrl/cmd + Enter key
  24. useEffect(() => {
  25. if (onSave == null) {
  26. return;
  27. }
  28. const keymapExtension = keymap.of([
  29. {
  30. key: 'Mod-Enter',
  31. preventDefault: true,
  32. run: () => {
  33. const doc = codeMirrorEditor?.getDoc();
  34. if (doc != null) {
  35. onSave();
  36. }
  37. return true;
  38. },
  39. },
  40. ]);
  41. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(keymapExtension);
  42. return cleanupFunction;
  43. }, [codeMirrorEditor, onSave]);
  44. return (
  45. <CodeMirrorEditor
  46. editorKey={editorKey}
  47. onSave={onSave}
  48. {...rest}
  49. />
  50. );
  51. });