React-draft-wysiwyg: getting a setState error when using MaterialUI tabs

Created on 6 Jan 2020  路  15Comments  路  Source: jpuri/react-draft-wysiwyg

This looks like an error that was introduced with version 1.14.3. If the WYSIWYG Editor is in a MaterialUI tab, when you switch away from the editor, you get this:

Warning: Can't call setState on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the r component.

Here's an isolated case that produces the issue (at least in my environment):

import React, { Fragment, useState } from 'react';

import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';

import { EditorState, ContentState } from 'draft-js';
import { Editor } from 'react-draft-wysiwyg';
import htmlToDraft from 'html-to-draftjs';

const toDraft = (value: any) => {
  const draftValue = htmlToDraft(value || '');
  const { contentBlocks, entityMap } = draftValue;
  const contentState = ContentState.createFromBlockArray(
    contentBlocks,
    entityMap
  );

  return EditorState.createWithContent(contentState);
};

const Test = () => {
  const [tabIndex, setTabIndex] = useState(0);
  const [editorState, setEditorState] = useState(toDraft('Hello, world!'));

  return (
    <Fragment>
      <Tabs
        centered={true}
        indicatorColor="primary"
        onChange={(evt: any, value: number) => {
          setTabIndex(value);
        }}
        textColor="primary"
        value={tabIndex}
      >
        <Tab label="Editor" value={0} />
        <Tab label="One" value={1} />
      </Tabs>
      <div>
        {tabIndex === 0 ? (
          <div>
            <Editor
              editorState={editorState}
              onEditorStateChange={(value: any) => {
                setEditorState(value);
              }}
              toolbar={{
                inline: {
                  options: ['bold', 'italic', 'underline', 'strikethrough']
                },
                list: {
                  options: ['unordered', 'ordered']
                },
                options: ['inline', 'blockType', 'list', 'textAlign'],
                textAlign: {
                  options: ['left', 'center', 'right']
                }
              }}
            />
          </div>
        ) : null}
        {tabIndex === 1 ? <div>One</div> : null}
      </div>
    </Fragment>
  );
};

export default Test;

Most helpful comment

@jpuri Are you able to take a look at some of the PR which might fix this please? (#1044 & #1008) There are now a few issues around which I think relate to the same problem (#953, #951 & #918). I'd like to use this for an application but this issue is currently preventing me (and I'm sure others too). Thank you 馃槃

All 15 comments

FWIW, this issue still exists in 1.14.4

@bmueller-sykes: I will check this soon.

@bmueller-sykes : can you plz share complete trace of warning. I am not able to replicate issue and even find which code change may be causing this.

@jpuri Hopefully this is useful. Let me know if I can provide any further detail. I'm sorry to say the error message itself is pretty vague.

Screen Shot 2020-01-13 at 10 32 13 AM

@jpuri any solutions to this warning yet?

I have the same issue when using inside MUI Tab

Same issue. As soon as I focus i.e try to type into the box, I see those errors in console log.

https://codesandbox.io/s/brave-gareth-pwrlz?file=/src/App.js

Did anyone find any solution to this?

I am getting this error even without material UI. Is there any solution?

@oikantik to be clear, it doesn't actually go away on production--React just doesn't report errors in production environments, for performance and security reasons.

@jpuri Are you able to take a look at some of the PR which might fix this please? (#1044 & #1008) There are now a few issues around which I think relate to the same problem (#953, #951 & #918). I'd like to use this for an application but this issue is currently preventing me (and I'm sure others too). Thank you 馃槃

@jpuri any chance the PRs can be looked at, it would solve a few issues pretty quickly! 馃槃

Guys, as it looks like this repo is not maintained I've re-forked and pushed updated version (based on https://github.com/jpuri/react-draft-wysiwyg/pull/1044):
https://www.npmjs.com/package/@nick4fake/react-draft-wysiwyg

Please note, that for typescript you will need to manually add definitions:
````typescript
declare module '@nick4fake/react-draft-wysiwyg' {
import * as React from 'react';
import * as Draft from 'draft-js';

export type SyntheticKeyboardEvent = React.KeyboardEvent<{}>;
export type SyntheticEvent = React.SyntheticEvent<{}>;
export type RawDraftContentState = Draft.RawDraftContentState;

export class EditorState extends Draft.EditorState {}
export class ContentState extends Draft.ContentState {}
export class ContentBlock extends Draft.ContentBlock {}
export class SelectionState extends Draft.SelectionState {}

export interface EditorProps {
webDriverTestID?: string;
onChange?(contentState: RawDraftContentState): void;
onEditorStateChange?(editorState: EditorState): void;
onContentStateChange?(contentState: RawDraftContentState): void;
initialContentState?: RawDraftContentState;
defaultContentState?: RawDraftContentState;
contentState?: RawDraftContentState;
editorState?: EditorState;
defaultEditorState?: EditorState;
toolbarOnFocus?: boolean;
spellCheck?: boolean;
stripPastedStyles?: boolean;
toolbar?: object;
toolbarCustomButtons?: Array>;
toolbarClassName?: string;
toolbarHidden?: boolean;
locale?: string;
localization?: object;
editorClassName?: string;
wrapperClassName?: string;
toolbarStyle?: object;
editorStyle?: React.CSSProperties;
wrapperStyle?: React.CSSProperties;
uploadCallback?(file: object): Promise;
onFocus?(event: SyntheticEvent): void;
onBlur?(event: SyntheticEvent): void;
onTab?(event: SyntheticKeyboardEvent): void;
mention?: object;
hashtag?: object;
textAlignment?: string;
readOnly?: boolean;
tabIndex?: number;
placeholder?: string;
ariaLabel?: string;
ariaOwneeID?: string;
ariaActiveDescendantID?: string;
ariaAutoComplete?: string;
ariaDescribedBy?: string;
ariaExpanded?: string;
ariaHasPopup?: string;
customBlockRenderFunc?(block: ContentBlock): any;
wrapperId?: number;
customDecorators?: object[];
editorRef?(ref: object): void;
handlePastedText?(
text: string,
html: string,
editorState: EditorState,
onChange: (editorState: EditorState) => void,
): boolean;
customStyleMap?: object;
}

export class Editor extends React.Component {
constructor(props: Readonly);
focusEditor(): void;
}

}

````

@nick4fake Any chance you can add the Typescript definitions to the @types repo? Here's the one for react-draft-wysiwyg

https://www.npmjs.com/package/@types/react-draft-wysiwyg

@nick4fake Thanks man, works like a charm.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Pixelatex picture Pixelatex  路  3Comments

FriOne picture FriOne  路  3Comments

regisBafutwabo picture regisBafutwabo  路  3Comments

Huespal picture Huespal  路  3Comments

Fireprufe15 picture Fireprufe15  路  4Comments