messages method

Stream<List<Message>> messages(
  1. Room room, {
  2. List<Object?>? endAt,
  3. List<Object?>? endBefore,
  4. int? limit,
  5. List<Object?>? startAfter,
  6. List<Object?>? startAt,
})

Returns a stream of messages from Firebase for a given room.

Implementation

Stream<List<types.Message>> messages(
  types.Room room, {
  List<Object?>? endAt,
  List<Object?>? endBefore,
  int? limit,
  List<Object?>? startAfter,
  List<Object?>? startAt,
}) {
  var query = getFirebaseFirestore()
      .collection('${config.roomsCollectionName}/${room.id}/messages')
      .orderBy('createdAt', descending: true);

  if (endAt != null) {
    query = query.endAt(endAt);
  }

  if (endBefore != null) {
    query = query.endBefore(endBefore);
  }

  if (limit != null) {
    query = query.limit(limit);
  }

  if (startAfter != null) {
    query = query.startAfter(startAfter);
  }

  if (startAt != null) {
    query = query.startAt(startAt);
  }

  return query.snapshots().map(
        (snapshot) => snapshot.docs.fold<List<types.Message>>(
          [],
          (previousValue, doc) {
            final data = doc.data();
            final author = room.users.firstWhere(
              (u) => u.id == data['authorId'],
              orElse: () => types.User(id: data['authorId'] as String),
            );

            data['author'] = author.toJson();
            data['createdAt'] = data['createdAt']?.millisecondsSinceEpoch;
            data['id'] = doc.id;
            data['updatedAt'] = data['updatedAt']?.millisecondsSinceEpoch;

            return [...previousValue, types.Message.fromJson(data)];
          },
        ),
      );
}