fix(work-orders): harden mention highlight boundary and submit catch [SH-217]

This commit is contained in:
arthur.bassi 2026-08-06 12:39:38 -03:00
parent 3b59bce973
commit 95bd443359
3 changed files with 21 additions and 4 deletions

View file

@ -75,9 +75,14 @@ export function WorkOrderActivityPanel({
if (!trimmed) {
return;
}
void Promise.resolve(onSubmitComment(trimmed)).then(() => {
setCommentText("");
});
void (async () => {
try {
await onSubmitComment(trimmed);
setCommentText("");
} catch {
// Mutation toast handles failure; keep the draft for retry.
}
})();
}}
className="mt-4 flex flex-col gap-2"
>

View file

@ -80,7 +80,8 @@ function appendPlainMentionMatches(
const sortedNames = [...mentionNames].sort((a, b) => b.length - a.length);
const namePattern = sortedNames.map((name) => escapeRegExp(name)).join("|");
const mentionRegex = new RegExp(`@(${namePattern})`, "g");
// Require a non-word boundary after the name so "@Ann" does not match inside "@Annual".
const mentionRegex = new RegExp(`@(${namePattern})(?![\\w])`, "g");
let cursor = 0;
for (const match of plainText.matchAll(mentionRegex)) {

View file

@ -70,6 +70,17 @@ describe("comment-mentions", () => {
]);
});
it("does not highlight shorter mention names as prefixes of longer @words", () => {
const text = "Check @Annual maintenance with @Ann";
expect(buildCommentBodySegments(text, ["user-ann"], [{ id: "user-ann", name: "Ann" }])).toEqual(
[
{ type: "text", value: "Check @Annual maintenance with " },
{ type: "mention", userId: "Ann", label: "Ann" },
],
);
});
it("finds active mention query at cursor", () => {
const text = "Hello @ja";
const query = findActiveMentionQuery(text, text.length);