CodeMirrorEditorComment.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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, CodeMirrorEditorProps } from '.';
  7. const additionalExtensions: Extension[] = [
  8. scrollPastEnd(),
  9. ];
  10. type Props = CodeMirrorEditorProps & object
  11. export const CodeMirrorEditorComment = (props: Props): JSX.Element => {
  12. const {
  13. onSave, ...otherProps
  14. } = props;
  15. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.COMMENT);
  16. // setup additional extensions
  17. useEffect(() => {
  18. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  19. }, [codeMirrorEditor]);
  20. // set handler to comment with ctrl/cmd + Enter key
  21. useEffect(() => {
  22. if (onSave == null) {
  23. return;
  24. }
  25. const keymapExtension = keymap.of([
  26. {
  27. key: 'Mod-Enter',
  28. preventDefault: true,
  29. run: () => {
  30. const doc = codeMirrorEditor?.getDoc();
  31. if (doc != null) {
  32. onSave();
  33. }
  34. return true;
  35. },
  36. },
  37. ]);
  38. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(keymapExtension);
  39. return cleanupFunction;
  40. }, [codeMirrorEditor, onSave]);
  41. return (
  42. <CodeMirrorEditor
  43. editorKey={GlobalCodeMirrorEditorKey.COMMENT}
  44. onSave={onSave}
  45. {...otherProps}
  46. />
  47. );
  48. };