CodeMirrorEditorComment.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. onComment?: () => void,
  13. acceptedFileType?: AcceptedUploadFileType,
  14. }
  15. export const CodeMirrorEditorComment = (props: Props): JSX.Element => {
  16. const {
  17. onComment, onChange, acceptedFileType,
  18. } = props;
  19. const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.COMMENT);
  20. const acceptedFileTypeNoOpt = acceptedFileType ?? AcceptedUploadFileType.NONE;
  21. // setup additional extensions
  22. useEffect(() => {
  23. return codeMirrorEditor?.appendExtensions?.(additionalExtensions);
  24. }, [codeMirrorEditor]);
  25. // set handler to comment with ctrl/cmd + Enter key
  26. useEffect(() => {
  27. if (onComment == null) {
  28. return;
  29. }
  30. const keymapExtension = keymap.of([
  31. {
  32. key: 'Mod-Enter',
  33. preventDefault: true,
  34. run: () => {
  35. const doc = codeMirrorEditor?.getDoc();
  36. if (doc != null) {
  37. onComment();
  38. }
  39. return true;
  40. },
  41. },
  42. ]);
  43. const cleanupFunction = codeMirrorEditor?.appendExtensions?.(keymapExtension);
  44. return cleanupFunction;
  45. }, [codeMirrorEditor, onComment]);
  46. return (
  47. <CodeMirrorEditor
  48. editorKey={GlobalCodeMirrorEditorKey.COMMENT}
  49. onChange={onChange}
  50. acceptedFileType={acceptedFileTypeNoOpt}
  51. />
  52. );
  53. };