From f873d68ee99168702cdbd48c287cd239a9a869de Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sat, 13 Jun 2026 15:58:27 +0200 Subject: [PATCH] fix(messenger): mark thread read in an effect, not during render MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FriendsMessengerThreadView called `thread.setRead()` in the render body — a side effect during render that mutates the MessengerThread instance the messenger hook also reads to compute the unread indicator, making unread state order-dependent (and it would NPE if `thread` was null). Move it into a no-dependency useEffect (runs after every commit, same cadence as before) and guard the null thread. --- .../messenger-thread/FriendsMessengerThreadView.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx index 8636997..39d940f 100644 --- a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react'; +import { FC, useEffect } from 'react'; import { MessengerThread } from '../../../../../api'; import { FriendsMessengerThreadGroup } from './FriendsMessengerThreadGroup'; @@ -6,7 +6,15 @@ export const FriendsMessengerThreadView: FC<{ thread: MessengerThread }> = props { const { thread = null } = props; - thread.setRead(); + // Mark the thread read after commit, not during render — render must stay + // side-effect free. No dep array: faithfully re-marks on every re-render + // (e.g. a new message arriving in the active thread), same as before. + useEffect(() => + { + if(thread) thread.setRead(); + }); + + if(!thread) return null; return ( <>