diff options
Diffstat (limited to 'src/state/queries/notifications/unread.tsx')
-rw-r--r-- | src/state/queries/notifications/unread.tsx | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/state/queries/notifications/unread.tsx b/src/state/queries/notifications/unread.tsx index d604e8fe0..49bb5a29d 100644 --- a/src/state/queries/notifications/unread.tsx +++ b/src/state/queries/notifications/unread.tsx @@ -25,7 +25,10 @@ type StateContext = string interface ApiContext { markAllRead: () => Promise<void> - checkUnread: (opts?: {invalidate?: boolean}) => Promise<void> + checkUnread: (opts?: { + invalidate?: boolean + isPoll?: boolean + }) => Promise<void> getCachedUnreadPage: () => FeedPage | undefined } @@ -50,6 +53,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { usableInFeed: false, syncedAt: new Date(), data: undefined, + unreadCount: 0, }) // periodic sync @@ -58,7 +62,10 @@ export function Provider({children}: React.PropsWithChildren<{}>) { return } checkUnreadRef.current() // fire on init - const interval = setInterval(checkUnreadRef.current, UPDATE_INTERVAL) + const interval = setInterval( + () => checkUnreadRef.current?.({isPoll: true}), + UPDATE_INTERVAL, + ) return () => clearInterval(interval) }, [hasSession]) @@ -69,6 +76,12 @@ export function Provider({children}: React.PropsWithChildren<{}>) { usableInFeed: false, syncedAt: new Date(), data: undefined, + unreadCount: + data.event === '30+' + ? 30 + : data.event === '' + ? 0 + : parseInt(data.event, 10) || 1, } setNumUnread(data.event) } @@ -95,13 +108,24 @@ export function Provider({children}: React.PropsWithChildren<{}>) { } }, - async checkUnread({invalidate}: {invalidate?: boolean} = {}) { + async checkUnread({ + invalidate, + isPoll, + }: {invalidate?: boolean; isPoll?: boolean} = {}) { try { if (!getAgent().session) return if (AppState.currentState !== 'active') { return } + // reduce polling if unread count is set + if (isPoll && cacheRef.current?.unreadCount !== 0) { + // if hit 30+ then don't poll, otherwise reduce polling by 50% + if (cacheRef.current?.unreadCount >= 30 || Math.random() >= 0.5) { + return + } + } + // count const page = await fetchPage({ cursor: undefined, @@ -133,6 +157,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { usableInFeed: !!invalidate, // will be used immediately data: page, syncedAt: !lastIndexed || now > lastIndexed ? now : lastIndexed, + unreadCount, } // update & broadcast |