insertMention method
Insert a mention into the input field from external source (e.g., long press on avatar) This is called when user long presses on another member's avatar in the message list
Implementation
void insertMention({required String userID, required String displayName}) {
if (!_isGroupChat) return;
// Don't allow mentioning self
final currentUserID = LoginStore.shared.loginState.loginUserInfo?.userID;
if (userID == currentUserID) return;
final text = _textEditingController.text;
final cursorPos = _textEditingController.selection.baseOffset;
final insertPos = cursorPos < 0 ? text.length : cursorPos;
// Create mention info
final mention = MentionInfo(
userID: userID,
displayName: displayName,
startIndex: insertPos,
);
final mentionText = mention.mentionText; // "@displayName "
// Build new text
final beforeCursor = text.substring(0, insertPos);
final afterCursor = text.substring(insertPos);
final newText = '$beforeCursor$mentionText$afterCursor';
final newCursorPos = insertPos + mentionText.length;
// Update mention positions for existing mentions after insert position
for (final m in _textEditingController._mentions) {
if (m.startIndex >= insertPos) {
m.startIndex += mentionText.length;
}
}
// Add the new mention
_textEditingController.addMention(mention);
// Update text field
_textEditingController.removeListener(_onTextChanged);
_textEditingController._isInternalUpdate = true;
_textEditingController.value = TextEditingValue(
text: newText,
selection: TextSelection.collapsed(offset: newCursorPos),
);
_textEditingController._isInternalUpdate = false;
_previousTextLength = newText.length;
_textEditingController.addListener(_onTextChanged);
// Request focus on the input field
_textEditingFocusNode.requestFocus();
// Update send button state
setState(() {
_showSendButton = newText.trim().isNotEmpty;
});
}