Open mentions dropdown when previous char is \n

If starting a newline then open the mentions dropdown when @
is typed.
Ideally we do this for emoji dropdown as well but there was
feedback this is triggered accidentally hence do this only for
the mentions dropdown.

Release-Notes: skip
Google-bug-id: b/236921879
Change-Id: I4b83ea8e4995212b7e533b28415375580ea197b3
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts
index 0cca7e8..9c5e975 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.ts
@@ -470,13 +470,21 @@
 
   // When special char is detected, set index. We are interested only on
   // special char after space or in beginning of textarea
+  // In case of mentions we are interested if previous char is '\n' as well
   private getSpecialCharIndex(text: string) {
+    const charAtCursor = text[this.textarea!.selectionStart - 1];
     if (
       this.textarea!.selectionStart < 2 ||
       text[this.textarea!.selectionStart - 2] === ' '
     ) {
       return this.textarea!.selectionStart - 1;
     }
+    if (
+      charAtCursor === '@' &&
+      text[this.textarea!.selectionStart - 2] === '\n'
+    ) {
+      return this.textarea!.selectionStart - 1;
+    }
     return -1;
   }
 
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts
index 5e6e645..bf01537 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.ts
@@ -134,6 +134,41 @@
       assert.equal(element.specialCharIndex, 0);
     });
 
+    test('mention selector opens when previous char is \n', async () => {
+      stubRestApi('getSuggestedAccounts').returns(
+        Promise.resolve([
+          createAccountWithEmail('abc@google.com'),
+          createAccountWithEmail('abcdef@google.com'),
+        ])
+      );
+      element.textarea!.focus();
+      await waitUntil(() => element.textarea!.focused === true);
+
+      element.textarea!.selectionStart = 1;
+      element.textarea!.selectionEnd = 1;
+      element.text = '\n@';
+
+      await waitUntil(() => element.suggestions.length > 0);
+      await element.updateComplete;
+
+      assert.isTrue(element.emojiSuggestions!.isHidden);
+      assert.isFalse(element.mentionsSuggestions!.isHidden);
+    });
+
+    test('emoji selector does not open when previous char is \n', async () => {
+      element.textarea!.focus();
+      await waitUntil(() => element.textarea!.focused === true);
+
+      element.textarea!.selectionStart = 1;
+      element.textarea!.selectionEnd = 1;
+      element.text = '\n:';
+
+      await element.updateComplete;
+
+      assert.isTrue(element.emojiSuggestions!.isHidden);
+      assert.isTrue(element.mentionsSuggestions!.isHidden);
+    });
+
     test('selecting mentions from dropdown', async () => {
       stubRestApi('getSuggestedAccounts').returns(
         Promise.resolve([