processRoomDocument function
Returns a types.Room created from Firebase document.
Implementation
Future<types.Room> processRoomDocument(
DocumentSnapshot<Map<String, dynamic>> doc,
User firebaseUser,
FirebaseFirestore instance,
String usersCollectionName,
) async {
final data = doc.data()!;
data['createdAt'] = data['createdAt']?.millisecondsSinceEpoch;
data['id'] = doc.id;
data['updatedAt'] = data['updatedAt']?.millisecondsSinceEpoch;
var imageUrl = data['imageUrl'] as String?;
var name = data['name'] as String?;
final type = data['type'] as String;
final userIds = data['userIds'] as List<dynamic>;
final userRoles = data['userRoles'] as Map<String, dynamic>?;
final users = await Future.wait(
userIds.map(
(userId) => fetchUser(
instance,
userId as String,
usersCollectionName,
role: userRoles?[userId] as String?,
),
),
);
if (type == types.RoomType.direct.toShortString()) {
try {
final otherUser = users.firstWhere(
(u) => u['id'] != firebaseUser.uid,
);
imageUrl = otherUser['imageUrl'] as String?;
name = '${otherUser['firstName'] ?? ''} ${otherUser['lastName'] ?? ''}'
.trim();
} catch (e) {
// Do nothing if other user is not found, because he should be found.
// Consider falling back to some default values.
}
}
data['imageUrl'] = imageUrl;
data['name'] = name;
data['users'] = users;
if (data['lastMessages'] != null) {
final lastMessages = data['lastMessages'].map((lm) {
final author = users.firstWhere(
(u) => u['id'] == lm['authorId'],
orElse: () => {'id': lm['authorId'] as String},
);
lm['author'] = author;
lm['createdAt'] = lm['createdAt']?.millisecondsSinceEpoch;
lm['id'] = lm['id'] ?? '';
lm['updatedAt'] = lm['updatedAt']?.millisecondsSinceEpoch;
return lm;
}).toList();
data['lastMessages'] = lastMessages;
}
return types.Room.fromJson(data);
}