UncontrolledCodeMirror.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. indentSize?: number;
  14. lineNumbers?: boolean;
  15. }
  16. interface UncontrolledCodeMirrorCoreProps extends UncontrolledCodeMirrorProps {
  17. editorContainer: Container<EditorContainer>;
  18. forwardedRef: Ref<UncontrolledCodeMirrorCore>;
  19. }
  20. class UncontrolledCodeMirrorCore extends AbstractEditor<UncontrolledCodeMirrorCoreProps> {
  21. render(): ReactNode {
  22. const {
  23. value, isGfmMode, indentSize, lineNumbers, editorContainer, options, forwardedRef, ...rest
  24. } = this.props;
  25. const { editorOptions } = editorContainer.state;
  26. return (
  27. <CodeMirror
  28. ref={forwardedRef}
  29. value={value}
  30. options={{
  31. lineNumbers: lineNumbers ?? true,
  32. mode: isGfmMode ? 'gfm-growi' : undefined,
  33. theme: editorOptions.theme,
  34. styleActiveLine: editorOptions.styleActiveLine,
  35. tabSize: 4,
  36. indentUnit: indentSize,
  37. ...options,
  38. }}
  39. {...rest}
  40. />
  41. );
  42. }
  43. }
  44. export const UncontrolledCodeMirror = forwardRef<UncontrolledCodeMirrorCore, UncontrolledCodeMirrorProps>((props, ref) => (
  45. <Subscribe to={[EditorContainer]}>
  46. {(EditorContainer: Container<EditorContainer>) => <UncontrolledCodeMirrorCore {...props} forwardedRef={ref} editorContainer={EditorContainer} />}
  47. </Subscribe>
  48. ));