import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from "react"; interface UnreadContextValue { hasUnread: boolean; // 推播觸發的提示 或 任一房間有未讀,兩者只要有一個成立即為 true markUnread: () => void; // Q-4:收到推播時呼叫 markRead: () => void; // Q-4:使用者切回聊天分頁時呼叫,只清推播提示,不動各房未讀數 roomUnreadCounts: Record; // T20-P2:各進行中房間的未讀數(來自大廳聚合查詢) setRoomUnreadCounts: (counts: Record) => void; totalRoomUnread: number; } const UnreadContext = createContext(null); // Q-4:聊天分頁的未讀/推播提示紅點狀態,由根佈局的推播接收監聽器寫入, // 由聊天分頁在取得焦點時清除(見 app/(tabs)/index.tsx 的 useFocusEffect)。 // T20-P2:擴充承接大廳多房未讀——分頁籤紅點現在同時反映「有推播尚未看」與「任一房間有未讀訊息」, // 兩個來源各自獨立更新,互不覆蓋(推播清除不會把房間未讀數也清空,反之亦然)。 export function UnreadProvider({ children }: { children: ReactNode }) { const [pushUnread, setPushUnread] = useState(false); const [roomUnreadCounts, setRoomUnreadCounts] = useState>({}); const markUnread = useCallback(() => setPushUnread(true), []); const markRead = useCallback(() => setPushUnread(false), []); const totalRoomUnread = useMemo( () => Object.values(roomUnreadCounts).reduce((sum, count) => sum + count, 0), [roomUnreadCounts], ); const hasUnread = pushUnread || totalRoomUnread > 0; return ( {children} ); } export function useUnread(): UnreadContextValue { const ctx = useContext(UnreadContext); if (!ctx) { throw new Error("useUnread 必須在 UnreadProvider 底下使用"); } return ctx; }