CodeMirrorEditorComment.tsx 1.5 KB

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