From 6b803a45f131c2956138fa3bde8a22675f80c762 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 23 Jul 2021 17:01:56 +0300 Subject: [PATCH] Message: Fix duplicating text with nested markup (#1314) --- .../common/helpers/renderMessageText.tsx | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/components/common/helpers/renderMessageText.tsx b/src/components/common/helpers/renderMessageText.tsx index f6d85bd37..c6806248d 100644 --- a/src/components/common/helpers/renderMessageText.tsx +++ b/src/components/common/helpers/renderMessageText.tsx @@ -44,12 +44,27 @@ function organizeEntity( } // Determine any nested entities inside current entity - const nestedEntities = entities + const nestedEntities: IOrganizedEntity[] = []; + const parsedNestedEntities = entities .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length) .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes)) .filter(Boolean as any); - nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i))); + parsedNestedEntities.forEach((parsedEntity) => { + let isChanged = false; + + parsedEntity.organizedIndexes.forEach((organizedIndex) => { + if (!isChanged && !organizedIndexes.has(organizedIndex)) { + isChanged = true; + } + + organizedIndexes.add(organizedIndex); + }); + + if (isChanged) { + nestedEntities.push(parsedEntity); + } + }); return { entity, @@ -95,7 +110,7 @@ export function renderTextWithEntities( const result: TextPart[] = []; let deleteLineBreakAfterPre = false; - const organizedEntites = organizeEntities(entities); + const organizedEntities = organizeEntities(entities); // Recursive function to render regular and nested entities function renderEntity( @@ -192,12 +207,12 @@ export function renderTextWithEntities( // Process highest-level entities let index = 0; - organizedEntites.forEach((entity, arrayIndex) => { + organizedEntities.forEach((entity, arrayIndex) => { const { renderResult, entityEndIndex } = renderEntity( index, text.length, entity, - arrayIndex === organizedEntites.length - 1, + arrayIndex === organizedEntities.length - 1, ); result.push(...renderResult);