UncontrolledCodeMirror.tsx 1.4 KB

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