Typing or autocorrecting inside a mention strips it to plain text

Offen
#855 8 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 4 Tagen

@JaydeepAgravat arbeitet bereits daran.

Seit 08.11.2026.

  • #858 von @JaydeepAgravat — offen

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
70/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
ios, objective-c, react-native
Bereich
frontend, mobile

Rechercherichtung

Start in the iOS implementation of shouldChangeTextInRange:replacementText: and read MentionStyle.remove:withDirtyRange: plus handleExistingMentions; the issue identifies these paths and getMentionParamsAt: as relevant. Check how edits inside and at the edges of a mention affect its attributes and emitted HTML. Done means typing, autocorrecting, or backspacing cannot leave visible plain text with the mention id silently lost; verify both whole mention deletion and edits beside it.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Description

On iOS, any edit that lands inside a mention silently strips it to plain text. The name stays on screen, the <mention> tag disappears from the emitted HTML, and the id with it — so a reader still sees what looks like a mention, while the application has lost the person it pointed to. In a messaging app that means the mentioned user is never notified, and nothing on screen says so.

This is the same model as #691, which was reported and fixed for Android. That issue states the intended behaviour, and I agree with it:

it should either stay intact or be deleted as a whole atomically

That issue also says the problem is "not reproducible on iOS", where editing "removes the whole mention range instead of leaving orphaned plain text". Reading the current source, that does not seem to be the case: MentionStyle.remove:withDirtyRange: is commented // Strip meta only and calls removeAttribute:MentionAttributeName. The attribute goes; the characters stay.

Steps to reproduce
  1. In an EnrichedTextInput with mentionIndicators={['@']}, insert a mention with setMention('@', '@Jane Doe', { id: '42' }).
  2. Place the caret in the middle of the name and type one character — or let iOS autocorrect the name, which hits the same path.
  3. Read onChangeHtml.

Expected: the mention is untouched (the character landing beside it), or it is removed whole.
Actual: <p>@Jane Dxoe</p> — plain text, no <mention>, no id.

A backspace inside the name does the same thing: one character disappears, and the mention silently stops being one.

Where it comes from

shouldChangeTextInRange:replacementText: consults no mention at any point, so every edit is accepted; handleExistingMentions then compares each mention's stored text to what the storage now holds, and drops the attribute when they differ.

Autocorrect is the worst case: it rewrites a proper noun without the user doing anything deliberate, and there is no way to opt out for a range — autoCorrect (added in 1.2.0, thanks!) is per-input, so turning it off to protect mentions also turns it off for the whole document.

Possible fix

Hold the rule where edits arrive, in shouldChangeTextInRange:replacementText::

  • the modified range intersects a mention, and the replacement is empty → remove the whole mention (plus the space setMention appended) and return NO;
  • it intersects a mention and the replacement is not empty → return NO.

For a collapsed caret, only strictly inside should count — on either edge the character legitimately belongs beside the mention.

One detail worth noting for whoever implements it: -attribute:atIndex:longestEffectiveRange: fills the range even when the attribute is absent, so a zero-length range is not the signal it appears to be. getMentionParamsAt: returning nil is the reliable check.

I have this running as a local patch against 1.2.0 and I am happy to open a PR if the approach suits you.

Version

react-native-enriched-html 1.2.0, React Native 0.86.3, iOS.

Vorherrschende Sprache
C
Sterne
1.4k
Forks
76
Ø Merge
3 T. 10 Std.
Gemergte PRs (30 T.)
23

Entwicklungsumgebung

  • Kein Dockerfile und keine Docker-Compose-Datei
  • Hat eine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus software-mansion/react-native-enriched-html

Alle Issues in software-mansion/react-native-enriched-html

Ähnliche Issues

Weitere Issues zu C

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.