diff --git a/src/renderer/components/team/activity/ActivityTimeline.tsx b/src/renderer/components/team/activity/ActivityTimeline.tsx index f15cb7f4..00dde0b1 100644 --- a/src/renderer/components/team/activity/ActivityTimeline.tsx +++ b/src/renderer/components/team/activity/ActivityTimeline.tsx @@ -41,8 +41,14 @@ const MessageRowWithObserver = ({ const reportedRef = useRef(false); const messageRef = useRef(message); const onVisibleRef = useRef(onVisible); - messageRef.current = message; - onVisibleRef.current = onVisible; + + useEffect(() => { + messageRef.current = message; + }, [message]); + + useEffect(() => { + onVisibleRef.current = onVisible; + }, [onVisible]); useEffect(() => { if (!onVisible) return; diff --git a/src/renderer/components/team/dialogs/TaskDetailDialog.tsx b/src/renderer/components/team/dialogs/TaskDetailDialog.tsx index b85a2567..8c89c61a 100644 --- a/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +++ b/src/renderer/components/team/dialogs/TaskDetailDialog.tsx @@ -57,7 +57,7 @@ export const TaskDetailDialog = ({ if (comments.length === 0) return; const latest = Math.max(...comments.map((c) => new Date(c.createdAt).getTime())); if (latest > 0) markAsRead(teamName, currentTask.id, latest); - }, [open, teamName, currentTask?.id, currentTask?.comments]); + }, [open, teamName, currentTask]); const handleDependencyClick = (taskId: string): void => { onClose(); diff --git a/src/renderer/hooks/useTeamMessagesRead.ts b/src/renderer/hooks/useTeamMessagesRead.ts index 95a6eca1..df7e016a 100644 --- a/src/renderer/hooks/useTeamMessagesRead.ts +++ b/src/renderer/hooks/useTeamMessagesRead.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { getReadSet as getReadSetStorage, @@ -9,28 +9,23 @@ export function useTeamMessagesRead(teamName: string): { readSet: Set; markRead: (messageKey: string) => void; } { - const [readSet, setReadSet] = useState>(() => - teamName ? getReadSetStorage(teamName) : new Set() + const [version, setVersion] = useState(0); + const readSet = useMemo( + () => { + if (version < 0) return new Set(); + return teamName ? getReadSetStorage(teamName) : new Set(); + }, + [teamName, version] ); - useEffect(() => { - if (!teamName) { - setReadSet(new Set()); - return; - } - setReadSet(getReadSetStorage(teamName)); - }, [teamName]); - const markRead = useCallback( (messageKey: string) => { if (!teamName) return; - setReadSet((prev) => { - if (prev.has(messageKey)) return prev; - const next = new Set(prev); - next.add(messageKey); - markReadStorage(teamName, messageKey, next); - return next; - }); + const existing = getReadSetStorage(teamName); + if (existing.has(messageKey)) return; + existing.add(messageKey); + markReadStorage(teamName, messageKey, existing); + setVersion((v) => v + 1); }, [teamName] );