canAddChannel method

Future<bool> canAddChannel(
  1. CollectionEventSource eventSource,
  2. GroupChannel addedChannel, {
  3. bool checkToUpdateChannel = false,
})

Implementation

Future<bool> canAddChannel(
  CollectionEventSource eventSource,
  GroupChannel addedChannel, {
  bool checkToUpdateChannel = false,
}) async {
  if (_isLoadedOnce == false) {
    return false;
  }

  if (_query.includeEmpty == false) {
    if (checkToUpdateChannel) {
      // This is related to messageDeletionTimestamp.
      if (eventSource == CollectionEventSource.eventChannelChanged) {
        if (addedChannel.lastMessage == null) {
          return false;
        }
      }
    } else {
      if (eventSource == CollectionEventSource.channelCacheLoadMore ||
          eventSource == CollectionEventSource.channelLoadMore) {
        if (addedChannel.lastMessage == null) {
          return false;
        }
      } else if (eventSource == CollectionEventSource.eventMessageSent) {
        if (addedChannel.lastMessage == null) {
          return true; // Check
        }
      }
    }
  }

  if (eventSource == CollectionEventSource.channelCacheLoadMore ||
      eventSource == CollectionEventSource.channelLoadMore) {
    return true;
  }

  if (channelList.isNotEmpty && hasMore) {
    final a = channelList.last;
    final b = addedChannel;
    switch (_query.order) {
      case GroupChannelListQueryOrder.chronological:
        if (a.createdAt != null && b.createdAt != null) {
          if (b.createdAt!.compareTo(a.createdAt!) == -1) {
            // a.createdAt > b.createdAt
            return false;
          }
        }
        break;

      case GroupChannelListQueryOrder.latestLastMessage:
        if (a.lastMessage != null && b.lastMessage == null) {
          // a < b
          if (checkToUpdateChannel) return true;
          return false;
        } else if (a.lastMessage == null && b.lastMessage != null) {
          // return true
        } else if (a.lastMessage != null && b.lastMessage != null) {
          if (b.lastMessage!.createdAt.compareTo(a.lastMessage!.createdAt) ==
              -1) {
            // a.lastMessage!.createdAt > b.lastMessage!.createdAt
            if (checkToUpdateChannel) return true;
            return false;
          }
        } else if (a.createdAt != null && b.createdAt != null) {
          if (b.createdAt!.compareTo(a.createdAt!) == -1) {
            // a.createdAt > b.createdAt
            return false;
          }
        }
        break;

      case GroupChannelListQueryOrder.channelNameAlphabetical:
        if (a.name.compareTo(b.name) == -1) {
          // a.name < b.name
          return false;
        }
        break;

      case GroupChannelListQueryOrder.metadataValueAlphabetical:
        // TODO: (?)
        // return true
        break;
    }
  }

  if (checkToUpdateChannel) {
    if (eventSource == CollectionEventSource.eventChannelHidden) {
      return _canAddChannel(query: _query, channel: addedChannel);
    }
  } else {
    //+ DBManager
    if (_chat.dbManager.isEnabled()) {
      if (await _chat.dbManager.canAddChannel(
              query: _query, channelUrl: addedChannel.channelUrl) ==
          false) {
        return false;
      }
    }
    //- DBManager
    else {
      if (_canAddChannel(query: _query, channel: addedChannel) == false) {
        return false;
      }
    }
  }

  return true;
}