fix(editor): prevent '@' character appearing when backspacing emoji

When backspacing a custom emoji in the text composer, TipTap's Mention
extension would fall back to its default renderText implementation which
uses `suggestion?.char ?? '@'`. When the suggestion context is unavailable
(e.g., during backspace/delete operations), this fallback produces '@'
followed by the emoji shortcode, which then triggers the profile mention
suggestion showing "No profiles found".

Fix by providing an explicit renderText option to EmojiMention.configure()
that always returns the correct format: the actual character for unicode
emojis, or `:shortcode:` for custom emojis. This ensures consistent text
representation regardless of whether suggestion context is available.

Applied to both MentionEditor and RichEditor components.

https://claude.ai/code/session_01YWNAEhjLprna1iWcnQEr1o
This commit is contained in:
Claude
2026-02-02 10:54:04 +00:00
parent 38a6dddedb
commit 41f5e98aed
2 changed files with 18 additions and 1 deletions

View File

@@ -900,7 +900,15 @@ export const MentionEditor = forwardRef<
.run();
},
},
// Note: renderLabel is not used when nodeView is defined
// Provide renderText option to prevent fallback to '@' character
// TipTap's default renderText uses `suggestion?.char ?? '@'` which
// can produce '@' when suggestion context is unavailable (e.g., during backspace)
renderText({ node }: any) {
if (node.attrs.source === "unicode") {
return node.attrs.url || "";
}
return `:${node.attrs.id}:`;
},
}),
);
}

View File

@@ -507,6 +507,15 @@ export const RichEditor = forwardRef<RichEditorHandle, RichEditorProps>(
.run();
},
},
// Provide renderText option to prevent fallback to '@' character
// TipTap's default renderText uses `suggestion?.char ?? '@'` which
// can produce '@' when suggestion context is unavailable (e.g., during backspace)
renderText({ node }: any) {
if (node.attrs.source === "unicode") {
return node.attrs.url || "";
}
return `:${node.attrs.id}:`;
},
}),
);
}