From 5cfdf669021067223797816f2a53ba9a1fd0681b Mon Sep 17 00:00:00 2001 From: David Calhoun Date: Wed, 13 Dec 2023 11:56:48 -0500 Subject: [PATCH] fix: Convert `RichTextData` to string before comparing values The value stored in the rich text component may be a string or a `RichTextData`. Until the value is store consistently, it may be necessary to convert each value to a string prior to equality comparisons. --- .../rich-text/native/index.native.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/block-editor/src/components/rich-text/native/index.native.js b/packages/block-editor/src/components/rich-text/native/index.native.js index b7b9ebdd787b17..116425a15b53b1 100644 --- a/packages/block-editor/src/components/rich-text/native/index.native.js +++ b/packages/block-editor/src/components/rich-text/native/index.native.js @@ -267,7 +267,7 @@ export class RichText extends Component { onCreateUndoLevel() { const { __unstableOnCreateUndoLevel: onCreateUndoLevel } = this.props; // If the content is the same, no level needs to be created. - if ( this.lastHistoryValue === this.value ) { + if ( this.lastHistoryValue.toString() === this.value.toString() ) { return; } @@ -320,7 +320,7 @@ export class RichText extends Component { unescapeSpaces( event.nativeEvent.text ) ); // On iOS, onChange can be triggered after selection changes, even though there are no content changes. - if ( contentWithoutRootTag === this.value ) { + if ( contentWithoutRootTag === this.value.toString() ) { return; } this.lastEventCount = event.nativeEvent.eventCount; @@ -567,7 +567,7 @@ export class RichText extends Component { // Check if value is up to date with latest state of native AztecView. if ( event.nativeEvent.text && - event.nativeEvent.text !== this.props.value + event.nativeEvent.text !== this.props.value.toString() ) { this.onTextUpdate( event ); } @@ -592,7 +592,7 @@ export class RichText extends Component { // this approach is not perfectly reliable. const isManual = this.lastAztecEventType !== 'input' && - this.props.value === this.value; + this.props.value.toString() === this.value.toString(); if ( hasChanged && isManual ) { const value = this.createRecord(); const activeFormats = getActiveFormats( value ); @@ -662,7 +662,7 @@ export class RichText extends Component { unescapeSpaces( event.nativeEvent.text ) ); if ( - contentWithoutRootTag === this.value && + contentWithoutRootTag === this.value.toString() && realStart === this.selectionStart && realEnd === this.selectionEnd ) { @@ -759,7 +759,7 @@ export class RichText extends Component { typeof nextProps.value !== 'undefined' && typeof this.props.value !== 'undefined' && ( ! this.comesFromAztec || ! this.firedAfterTextChanged ) && - nextProps.value !== this.props.value + nextProps.value.toString() !== this.props.value.toString() ) { // Gutenberg seems to try to mirror the caret state even on events that only change the content so, // let's force caret update if state has selection set. @@ -833,7 +833,7 @@ export class RichText extends Component { const { style, tagName } = this.props; const { currentFontSize } = this.state; - if ( this.props.value !== this.value ) { + if ( this.props.value.toString() !== this.value.toString() ) { this.value = this.props.value; } const { __unstableIsSelected: prevIsSelected } = prevProps; @@ -851,7 +851,7 @@ export class RichText extends Component { // Since this is happening when merging blocks, the selection should be at the last character position. // As a fallback the internal selectionEnd value is used. const lastCharacterPosition = - this.value?.length ?? this.selectionEnd; + this.value?.toString().length ?? this.selectionEnd; this._editor.focus(); this.props.onSelectionChange( lastCharacterPosition, @@ -893,7 +893,8 @@ export class RichText extends Component { // On android if content is empty we need to send no content or else the placeholder will not show. if ( ! this.isIOS && - ( value === '' || value === EMPTY_PARAGRAPH_TAGS ) + ( value.toString() === '' || + value.toString() === EMPTY_PARAGRAPH_TAGS ) ) { return ''; }