codemirror-editor.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { useEffect } from 'react';
  2. import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
  3. import { languages } from '@codemirror/language-data';
  4. import { EditorState, Extension } from '@codemirror/state';
  5. import { EditorView, scrollPastEnd } from '@codemirror/view';
  6. import { useCodeMirror, type UseCodeMirror } from '@uiw/react-codemirror';
  7. export type UseCodeMirrorEditor = UseCodeMirror;
  8. export type UseCodeMirrorEditorStates = {
  9. state: EditorState | undefined;
  10. setState: import('react').Dispatch<import('react').SetStateAction<EditorState | undefined>>;
  11. view: EditorView | undefined;
  12. setView: import('react').Dispatch<import('react').SetStateAction<EditorView | undefined>>;
  13. container: HTMLDivElement | undefined;
  14. setContainer: import('react').Dispatch<import('react').SetStateAction<HTMLDivElement | undefined>>;
  15. }
  16. const defaultExtensions: Extension[] = [
  17. markdown({ base: markdownLanguage, codeLanguages: languages }),
  18. scrollPastEnd(),
  19. ];
  20. export const useCodeMirrorEditor = (props?: UseCodeMirrorEditor): UseCodeMirrorEditorStates => {
  21. const codemirror = useCodeMirror({
  22. extensions: defaultExtensions,
  23. ...props,
  24. });
  25. const { setContainer } = codemirror;
  26. useEffect(() => {
  27. if (props?.container != null) {
  28. setContainer(props.container);
  29. }
  30. }, [props?.container, setContainer]);
  31. return codemirror;
  32. };