removeChatMember method

  1. @override
Future<void> removeChatMember(
  1. ChatId chatId,
  2. UserId userId
)
override

Removes an User from a Chat-group by the authority of the authenticated MyUser.

Implementation

@override
Future<void> removeChatMember(ChatId chatId, UserId userId) async {
  Log.debug('removeChatMember($chatId, $userId)', '$runtimeType');

  final RxChatImpl? chat = chats[chatId];
  final DtoChatMember? member = chat?.members.pagination?.items[userId];

  if (chat?.chat.value.isGroup == false) {
    // No-op.
    return;
  }

  chat?.members.remove(userId);

  try {
    try {
      await Backoff.run(
        () async {
          await _graphQlProvider.removeChatMember(chatId, userId);
        },
        retryIf: (e) => e.isNetworkRelated,
        retries: 10,
      );
    } on RemoveChatMemberException catch (e) {
      switch (e.code) {
        case RemoveChatMemberErrorCode.artemisUnknown:
          rethrow;

        case RemoveChatMemberErrorCode.notGroup:
          if (member != null) {
            chat?.members.put(member);
          }
          break;

        case RemoveChatMemberErrorCode.unknownChat:
          await remove(chatId);
          break;
      }
    }
  } catch (_) {
    if (member != null) {
      chat?.members.put(member);
    }

    rethrow;
  }

  await onMemberRemoved?.call(chatId, userId);
}