insertMention method

void insertMention({
  1. required String userID,
  2. required String displayName,
})

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;
  });
}