messages method
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)];
},
),
);
}