❌Deletar chat
Aqui eu vou mostrar como eu criei uma lógica própria para criar uma funcionalidade de deletar chat.
O plugin em si possui uma função para excluir o documento do chat no firebase, porém, ele exclui de maneira definitiva, e pensando na funcionalidade de chats, isso não funciona pra maioria dos casos.
Como esses chats existem de maneira singular e possuindo os usuários dentro de si, caso um usuário deletasse um chat, ele seria deletado para o outro usuário também, o que não é o ideal. Por isso, eu vou mostrar a lógica que criei para uma funcionamento que faria mais sentido.
Mais uma vez, fiz o uso da propriedade metadata de dentro do documento do chat.
Para simular que um usuário deletou o chat, eu faço o seguinte update dentro do metadata:
FirebaseFirestore.instance.collection("rooms").doc(chatRoomId).update(
{
"metadata.deletedTimes.$currentUserId":
Timestamp.fromDate(DateTime.now().add(const Duration(seconds: 3))),
},
);
Dentro do metadata, crio um array de nome deletedTimes, e dentro pode existir um map em que a chave é o ID do usuário e o valor é a hora em que ele deletou esse determinado chat pela última vez.
A partir disso, devem ser feitas duas coisas: Mostrar apenas mensagens que foram enviadas após esse datetime e mostrar apenas os chats em que tiveram alguma atualização após esse datetime do usuário, caso ele exista.
Como exemplo da questão das mensagens, criei uma variável para guardar a possível data em que o usuário deletou o chat:
currentUserDeletedTime = currentRoom?.metadata?['deletedTimes']?[FirebaseAuth.instance.currentUser.uid];
Com isso, na hora da listar as mensagens com o StreamBuilder, posso fazer a seguinte verificação, para utilizar a lista:
snapshot.data!.where((message) => (message.createdAt ?? Timestamp.now().millisecondsSinceEpoch) >
currentUserDeletedTime!.toDate().millisecondsSinceEpoch)
.toList()
Mostrando assim, apenas as mensagens que foram enviada após o momento que o usuário deletou.
A para a mesma verificação na lista de chats, fiz a seguinte lógica:
bool isChatNotEmpty = room != null && room.metadata?['lastMessageSent'] != null &&
room.metadata!['lastMessageSent'].toString().isNotEmpty;
Timestamp? currentUserDeletedTime = room?.metadata?['deletedTimes']?[_userStore.currentUserData?.firebaseId];
bool isChatDeletedByUser = room == null
? true : currentUserDeletedTime == null ? false :
currentUserDeletedTime.millisecondsSinceEpoch > (room.updatedAt ?? 0);
return isChatNotEmpty && !isChatDeletedByUser ? MOSTRAR O CHAT : NAO MOSTRAR O CHAT
Mostrando o chat apenas se ele não estiver vazio e se tiver mensagens após o momento que ele deletou.
Last updated