Improve unread notif tracking (#2056)

zio/stable
Paul Frazee 2023-11-30 18:56:55 -08:00 committed by GitHub
parent 826cbbd4bf
commit f8c46c08ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 23 deletions

View File

@ -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()
}
// do a normal fetch
return fetchPage({
limit: PAGE_SIZE,
cursor: pageParam,
queryClient,
moderationOpts,
threadMutes,
})
if (!page) {
page = await 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,

View File

@ -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[] = []