如何在React/Firebase聊天应用中处理已读/未读的聊天消息?

3
我正在使用React和Firebase实时数据库处理一对一聊天应用程序中的已读和未读消息状态。
我可以在数据库中为每个发送的消息存储seen:false的值,当接收者挂载组件(消息)时,再次向数据库发出请求并将“seen”值更改为“true”吗?
这里会有太多的数据库请求吗?
1个回答

5

在数据库中为每个发送的消息存储一个“已读”标记,当接收方加载该消息时再从数据库中请求并将标记更改为“已读”,这是一个好的做法吗?

我认为您不需要为每个消息都这样做。

假设您有用户1和用户2之间的私人对话。

用户1发送了两条消息:

Id: 1 Message: "hello"
Id: 2 Message: "how are you"

然后,User2查看您发送到服务器的消息:

User: 2 ChatID: abc LastViewedMessage: 2

User1回到消息界面,从服务器接收到User2的lastViewedMessage id。

我认为没有必要按“每条消息”的方式存储它——除非您特别需要将某些消息标记为已查看。

您也可以存储消息的时间戳和“最后查看时间”,而不是消息id。


你可能想跟踪每条消息的状态,唯一的原因就是当用户承认已经查看了每一条消息时。但是大多数聊天应用程序通过存储用户最后查看的消息的ID/时间戳来跟踪。 - Frank van Puffelen
如果用户1发送了5条消息,并且用户2都已阅读,那么更改所有已读消息的状态为“已看”应该采取什么逻辑?每条消息是否仍需要具有True/False已看值? - zorro
忘掉每个消息的已读/未读概念。无论对话消息存储在哪里,您都希望在每个用户的基础上包含他们最后看到的消息。因此,逻辑将是user2已经看到了发送的5条消息中的(last-message-id)。 - nxSolari
是的,我理解这一点,但在我的用户界面中,所有消息都有已读/未读状态,我的问题是如果我只知道最后一条消息的ID,我应该如何更改所有先前消息的UI状态?我应该使用状态吗? :) - zorro
是的 - 对于这个问题使用状态(state)是有意义的。假设你只处理一对一的对话,你可以在状态(state)中存储lastSeenMessage,如果你处理群组消息,你需要有一个对象映射用户名: lastSeenMessage。为了在单个消息上显示“已看到”图标,你需要有逻辑来检查消息是否已被查看(即消息ID < lastSeenMessage),然后将“已看到”图标应用于该消息。 - nxSolari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接