You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetStream Chat未读消息计数徽章状态更新异常问题求助

GetStream Chat未读消息计数徽章状态更新异常问题求助

各位大佬好!我正在给我们的网站集成GetStream的聊天功能,想实现一个类似FB、Twitter、Instagram那样的未读消息计数徽章,但状态更新的逻辑出了问题,实在摸不着头脑,麻烦各位帮忙看看哪里错了!

目前的情况是:GetStream的事件监听器确实能工作,但状态更新非常不稳定:

  • 用户收到新消息时,徽章和计数能正常显示,但只要切换到非聊天窗口的其他页面,计数就消失了;刷新页面后计数又会回来,之后再切换页面计数能保持住。
  • 但如果收到第二条消息,计数会更新成2,可切换页面后又变回1,必须刷新页面才会显示正确的2。
  • 另外,进入聊天页面后计数应该重置为0,但现在完全不会,只有刷新页面才会归0。

我感觉肯定是状态更新的逻辑没写对,现在这段逻辑是写成了自定义Hook,也可以移到组件里去,下面是我的代码:

const useUnreadMessagesCount = () => {

  const { user } = useAuth()
  const { client: chatClient } = useChatContext()
  const [unreadCount, setUnreadCount] = useState<any>()
  const { token } = useStreamToken()

  useEffect(() => {
    async function init() {
      // 初始化状态,因为看起来client.on事件只在新事件触发时执行
      if (user != null) {
        const response: any = await chatClient.connectUser({ id: user.uid }, token)
        setUnreadCount(response.me.total_unread_count)
      }

      // 新事件触发时更新状态
      chatClient.on((event) => {
        console.log("HERE")
        if (event.unread_channels !== undefined) {
          console.log("COUNT: ", event.total_unread_count)
          setUnreadCount(event.total_unread_count)
        }
      })
    }

    init()

    // @ts-ignore
    chatClient.on("user.presence.changed", init())

    return () => {
      // @ts-ignore
      chatClient.off("user.presence.changed", init())
    }
  }, [chatClient])

  return unreadCount
}

export default useUnreadMessagesCount

有没有大佬能帮我找出问题所在呀?跪谢!

备注:内容来源于stack exchange,提问作者Thomas Lester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:04:49