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