Fix notification mark-read behaviors (#2696)

* Mark read on first notifs page fetch always; this is less optimal but it fixes a case where when the first full page's unreads are all filtered out

* Use the pre-filter indexedAt for updateSeen
zio/stable
Paul Frazee 2024-01-30 17:46:35 -08:00 committed by GitHub
parent a175922ccf
commit 45291f17a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 17 deletions

View File

@ -67,18 +67,20 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
page = unreads.getCachedUnreadPage()
}
if (!page) {
page = await fetchPage({
limit: PAGE_SIZE,
cursor: pageParam,
queryClient,
moderationOpts,
threadMutes,
fetchAdditionalData: true,
})
page = (
await fetchPage({
limit: PAGE_SIZE,
cursor: pageParam,
queryClient,
moderationOpts,
threadMutes,
fetchAdditionalData: true,
})
).page
}
// if the first page has an unread, mark all read
if (!pageParam && page.items[0] && !page.items[0].notification.isRead) {
if (!pageParam) {
unreads.markAllRead()
}

View File

@ -127,7 +127,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
}
// count
const page = await fetchPage({
const {page, indexedAt: lastIndexed} = await fetchPage({
cursor: undefined,
limit: 40,
queryClient,
@ -151,12 +151,14 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
// track last sync
const now = new Date()
const lastIndexed =
page.items[0] && new Date(page.items[0].notification.indexedAt)
const lastIndexedDate = lastIndexed
? new Date(lastIndexed)
: undefined
cacheRef.current = {
usableInFeed: !!invalidate, // will be used immediately
data: page,
syncedAt: !lastIndexed || now > lastIndexed ? now : lastIndexed,
syncedAt:
!lastIndexedDate || now > lastIndexedDate ? now : lastIndexedDate,
unreadCount,
}

View File

@ -36,11 +36,12 @@ export async function fetchPage({
moderationOpts: ModerationOpts | undefined
threadMutes: string[]
fetchAdditionalData: boolean
}): Promise<FeedPage> {
}): Promise<{page: FeedPage; indexedAt: string | undefined}> {
const res = await getAgent().listNotifications({
limit,
cursor,
})
const indexedAt = res.data.notifications[0]?.indexedAt
// filter out notifs by mod rules
const notifs = res.data.notifications.filter(
@ -75,9 +76,12 @@ export async function fetchPage({
}
return {
cursor: res.data.cursor,
seenAt,
items: notifsGrouped,
page: {
cursor: res.data.cursor,
seenAt,
items: notifsGrouped,
},
indexedAt,
}
}