From 2be02546c811873bf8335463f539c5865f2749f4 Mon Sep 17 00:00:00 2001 From: Steve Rubin Date: Fri, 15 Mar 2024 13:50:55 -0500 Subject: [PATCH] Adds onInput override for edit mode --- src/component/base/DraftEditor.react.tsx | 34 +++++++++--------------- src/component/base/DraftEditorProps.ts | 18 ++++++++++++- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/component/base/DraftEditor.react.tsx b/src/component/base/DraftEditor.react.tsx index 775990048..38735e597 100644 --- a/src/component/base/DraftEditor.react.tsx +++ b/src/component/base/DraftEditor.react.tsx @@ -578,29 +578,21 @@ export default class DraftEditor extends React.Component< setMode: (draftEditorModes: DraftEditorModes) => void = ( mode: DraftEditorModes, ): void => { - const {onPaste, onCut, onCopy} = this.props; - const editHandler = {...handlerMap.edit}; - - if (onPaste) { - /* $FlowFixMe(>=0.117.0 site=www,mobile) This comment suppresses an error found - * when Flow v0.117 was deployed. To see the error delete this comment - * and run Flow. */ - editHandler.onPaste = onPaste; - } - - if (onCut) { - editHandler.onCut = onCut; - } - - if (onCopy) { - editHandler.onCopy = onCopy; + const {onPaste, onCut, onCopy, onInput} = this.props; + + if (mode === 'edit') { + const editHandler = handlerMap.edit; + this._handler = { + ...editHandler, + onInput: onInput || editHandler.onInput, + onCopy: onCopy || editHandler.onCopy, + onCut: onCut || editHandler.onCut, + onPaste: onPaste || editHandler.onPaste, + }; + } else { + this._handler = handlerMap[mode]; } - const handler = { - ...handlerMap, - edit: editHandler, - }; - this._handler = handler[mode]; this.mode = mode; if (mode !== 'drag') { diff --git a/src/component/base/DraftEditorProps.ts b/src/component/base/DraftEditorProps.ts index cfa58e9a6..94f216581 100644 --- a/src/component/base/DraftEditorProps.ts +++ b/src/component/base/DraftEditorProps.ts @@ -20,7 +20,10 @@ import {DraftInlineStyle} from '../../model/immutable/DraftInlineStyle'; import {DraftBlockRenderMap} from '../../model/immutable/DraftBlockRenderMap'; import {CSSProperties} from 'react'; import DraftEditor from './DraftEditor.react'; -import {SyntheticClipboardEvent} from '../utils/eventTypes'; +import { + SyntheticClipboardEvent, + SyntheticInputEvent, +} from '../utils/eventTypes'; import {BlockNode} from '../../model/immutable/BlockNode'; export type DraftEditorProps = { @@ -206,6 +209,19 @@ export type DraftEditorProps = { syntheticClipboardEvent: SyntheticClipboardEvent, ) => void; + /** + * Override the default behavior for the editor's `onInput` handler in edit mode. + * The draft.js implementation is typically an important feature of draft.js + * but if the user is attempting to fully control the input (e.g., via + * overriding `handleBeforeInput` then they might want to override this + * in order to provide error handling in the unexpected event that we do + * end up in this handler). + */ + onInput?: ( + draftEditor: DraftEditor, + syntheticClipboardEvent: SyntheticInputEvent, + ) => void; + /** * Enables support for experimental (more performant) strategy for * updating DOM selection