UncontrolledCodeMirror.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import React, { forwardRef, ReactNode, Ref } from 'react';
  2. import { ICodeMirror, UnControlled as CodeMirror } from 'react-codemirror2';
  3. import { Container, Subscribe } from 'unstated';
  4. import EditorContainer from '~/client/services/EditorContainer';
  5. import AbstractEditor, { AbstractEditorProps } from '~/components/PageEditor/AbstractEditor';
  6. window.CodeMirror = require('codemirror');
  7. require('codemirror/addon/display/placeholder');
  8. require('~/client/util/codemirror/gfm-growi.mode');
  9. export interface UncontrolledCodeMirrorProps extends AbstractEditorProps {
  10. value: string;
  11. options?: ICodeMirror['options'];
  12. isGfmMode?: boolean;
  13. lineNumbers?: boolean;
  14. }
  15. interface UncontrolledCodeMirrorCoreProps extends UncontrolledCodeMirrorProps {
  16. editorContainer: Container<EditorContainer>;
  17. forwardedRef: Ref<UncontrolledCodeMirrorCore>;
  18. }
  19. class UncontrolledCodeMirrorCore extends AbstractEditor<UncontrolledCodeMirrorCoreProps> {
  20. render(): ReactNode {
  21. const {
  22. value, isGfmMode, lineNumbers, editorContainer, options, forwardedRef, ...rest
  23. } = this.props;
  24. const { editorOptions } = editorContainer.state;
  25. return (
  26. <CodeMirror
  27. ref={forwardedRef}
  28. value={value}
  29. options={{
  30. lineNumbers: lineNumbers ?? true,
  31. mode: isGfmMode ? 'gfm-growi' : undefined,
  32. theme: editorOptions.theme,
  33. styleActiveLine: editorOptions.styleActiveLine,
  34. tabSize: 4,
  35. ...options,
  36. }}
  37. {...rest}
  38. />
  39. );
  40. }
  41. }
  42. export const UncontrolledCodeMirror = forwardRef<UncontrolledCodeMirrorCore, UncontrolledCodeMirrorProps>((props, ref) => (
  43. <Subscribe to={[EditorContainer]}>
  44. {(EditorContainer: Container<EditorContainer>) => <UncontrolledCodeMirrorCore {...props} forwardedRef={ref} editorContainer={EditorContainer} />}
  45. </Subscribe>
  46. ));