canAddMessage method

bool canAddMessage(
  1. CollectionEventSource eventSource,
  2. RootMessage addedMessage
)

Implementation

bool canAddMessage(
  CollectionEventSource eventSource,
  RootMessage addedMessage,
) {
  if (eventSource == CollectionEventSource.messageCacheInitialize ||
      eventSource == CollectionEventSource.messageCacheLoadPrevious ||
      eventSource == CollectionEventSource.messageCacheLoadNext ||
      eventSource == CollectionEventSource.messageInitialize ||
      eventSource == CollectionEventSource.messageLoadPrevious ||
      eventSource == CollectionEventSource.messageLoadNext ||
      eventSource == CollectionEventSource.messageFill ||
      eventSource == CollectionEventSource.localMessagePendingCreated ||
      eventSource == CollectionEventSource.localMessageFailed ||
      eventSource == CollectionEventSource.localMessageCanceled ||
      eventSource == CollectionEventSource.localMessageResendStarted) {
    return true;
  }

  if (_isInitialized == false) {
    return false;
  }

  // hasPrevious
  if (hasPrevious) {
    if (messageList.isNotEmpty) {
      if (params.reverse) {
        if (addedMessage.createdAt < messageList.last.createdAt) {
          return false;
        }
      } else {
        if (addedMessage.createdAt < messageList.first.createdAt) {
          return false;
        }
      }
    }
  }

  // hasNext
  if (hasNext) {
    if (messageList.isNotEmpty) {
      if (params.reverse) {
        if (addedMessage.createdAt > messageList.first.createdAt) {
          return false;
        }
      } else {
        if (addedMessage.createdAt > messageList.last.createdAt) {
          return false;
        }
      }
    }
  }

  // [Filter] messageType
  switch (params.messageType) {
    case MessageTypeFilter.all:
      break;
    case MessageTypeFilter.user:
      if (addedMessage.messageType == MessageType.file ||
          addedMessage.messageType == MessageType.admin ||
          addedMessage.messageType == MessageType.notification) {
        return false;
      }
      break;
    case MessageTypeFilter.file:
      if (addedMessage.messageType == MessageType.user ||
          addedMessage.messageType == MessageType.admin ||
          addedMessage.messageType == MessageType.notification) {
        return false;
      }
      break;
    case MessageTypeFilter.admin:
      if (addedMessage.messageType == MessageType.user ||
          addedMessage.messageType == MessageType.file ||
          addedMessage.messageType == MessageType.notification) {
        return false;
      }
      break;
  }

  // [Filter] customTypes
  if (params.customTypes != null && params.customTypes!.isNotEmpty) {
    bool found = false;
    for (final customType in params.customTypes!) {
      if (addedMessage.customType == customType) {
        found = true;
        break;
      }
    }

    if (!found) {
      return false;
    }
  }

  // [Filter] senderIds
  if (addedMessage is BaseMessage &&
      params.senderIds != null &&
      params.customTypes!.isNotEmpty) {
    bool found = false;
    for (final senderId in params.senderIds!) {
      if (addedMessage.sender?.userId == senderId) {
        found = true;
        break;
      }
    }

    if (!found) {
      return false;
    }
  }

  return true;
}