about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2023-11-30 18:56:55 -0800
committerGitHub <noreply@github.com>2023-11-30 18:56:55 -0800
commitf8c46c08ca92aa1a6d86d1e594fc857171356264 (patch)
treec6df2089b7a1b6b8a6f597d2cc553871acae2b5f /src
parent826cbbd4bf3a9a3cfb87b6dedee630e915b07b27 (diff)
downloadvoidsky-f8c46c08ca92aa1a6d86d1e594fc857171356264.tar.zst
Improve unread notif tracking (#2056)
Diffstat (limited to 'src')
-rw-r--r--src/state/queries/notifications/feed.ts34
-rw-r--r--src/view/com/notifications/Feed.tsx11
2 files changed, 22 insertions, 23 deletions
diff --git a/src/state/queries/notifications/feed.ts b/src/state/queries/notifications/feed.ts
index 0fd9a2fef..16025f856 100644
--- a/src/state/queries/notifications/feed.ts
+++ b/src/state/queries/notifications/feed.ts
@@ -29,6 +29,7 @@ import {useUnreadNotificationsApi} from './unread'
 import {fetchPage} from './util'
 import {FeedPage} from './types'
 import {useMutedThreads} from '#/state/muted-threads'
+import {STALE} from '..'
 
 export type {NotificationType, FeedNotification, FeedPage} from './types'
 
@@ -54,23 +55,30 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
     QueryKey,
     RQPageParam
   >({
+    staleTime: STALE.INFINITY,
     queryKey: RQKEY(),
     async queryFn({pageParam}: {pageParam: RQPageParam}) {
-      // for the first page, we check the cached page held by the unread-checker first
+      let page
       if (!pageParam) {
-        const cachedPage = unreads.getCachedUnreadPage()
-        if (cachedPage) {
-          return cachedPage
-        }
+        // for the first page, we check the cached page held by the unread-checker first
+        page = unreads.getCachedUnreadPage()
+      }
+      if (!page) {
+        page = await fetchPage({
+          limit: PAGE_SIZE,
+          cursor: pageParam,
+          queryClient,
+          moderationOpts,
+          threadMutes,
+        })
       }
-      // do a normal fetch
-      return fetchPage({
-        limit: PAGE_SIZE,
-        cursor: pageParam,
-        queryClient,
-        moderationOpts,
-        threadMutes,
-      })
+
+      // if the first page has an unread, mark all read
+      if (!pageParam && page.items[0] && !page.items[0].notification.isRead) {
+        unreads.markAllRead()
+      }
+
+      return page
     },
     initialPageParam: undefined,
     getNextPageParam: lastPage => lastPage.cursor,
diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx
index c496d5f7c..260c9bbd5 100644
--- a/src/view/com/notifications/Feed.tsx
+++ b/src/view/com/notifications/Feed.tsx
@@ -35,7 +35,7 @@ export function Feed({
   const [isPTRing, setIsPTRing] = React.useState(false)
 
   const moderationOpts = useModerationOpts()
-  const {markAllRead, checkUnread} = useUnreadNotificationsApi()
+  const {checkUnread} = useUnreadNotificationsApi()
   const {
     data,
     isFetching,
@@ -47,15 +47,6 @@ export function Feed({
     fetchNextPage,
   } = useNotificationFeedQuery({enabled: !!moderationOpts})
   const isEmpty = !isFetching && !data?.pages[0]?.items.length
-  const firstItem = data?.pages[0]?.items[0]
-
-  // mark all read on fresh data
-  // (this will fire each time firstItem changes)
-  React.useEffect(() => {
-    if (firstItem) {
-      markAllRead()
-    }
-  }, [firstItem, markAllRead])
 
   const items = React.useMemo(() => {
     let arr: any[] = []