Reduce listConvos requests (#6378)
* Reduce page size for request * Remove refetch interval entirely * Add comment * Optimistically mark as read * Drop default active poll interval to 60s from 5min * Only optimistically update unread count if success
This commit is contained in:
@@ -1,2 +1,2 @@
|
|||||||
export const DEFAULT_POLL_INTERVAL = 60e3 * 5
|
export const DEFAULT_POLL_INTERVAL = 60e3
|
||||||
export const BACKGROUND_POLL_INTERVAL = 60e3 * 5
|
export const BACKGROUND_POLL_INTERVAL = 60e3 * 5
|
||||||
|
|||||||
@@ -5,7 +5,11 @@ import {STALE} from '#/state/queries'
|
|||||||
import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const'
|
import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const'
|
||||||
import {useOnMarkAsRead} from '#/state/queries/messages/list-converations'
|
import {useOnMarkAsRead} from '#/state/queries/messages/list-converations'
|
||||||
import {useAgent} from '#/state/session'
|
import {useAgent} from '#/state/session'
|
||||||
import {RQKEY as LIST_CONVOS_KEY} from './list-converations'
|
import {
|
||||||
|
ConvoListQueryData,
|
||||||
|
getConvoFromQueryData,
|
||||||
|
RQKEY as LIST_CONVOS_KEY,
|
||||||
|
} from './list-converations'
|
||||||
|
|
||||||
const RQKEY_ROOT = 'convo'
|
const RQKEY_ROOT = 'convo'
|
||||||
export const RQKEY = (convoId: string) => [RQKEY_ROOT, convoId]
|
export const RQKEY = (convoId: string) => [RQKEY_ROOT, convoId]
|
||||||
@@ -57,8 +61,37 @@ export function useMarkAsReadMutation() {
|
|||||||
if (!convoId) throw new Error('No convoId provided')
|
if (!convoId) throw new Error('No convoId provided')
|
||||||
optimisticUpdate(convoId)
|
optimisticUpdate(convoId)
|
||||||
},
|
},
|
||||||
onSettled() {
|
onSuccess(_, {convoId}) {
|
||||||
queryClient.invalidateQueries({queryKey: LIST_CONVOS_KEY})
|
if (!convoId) return
|
||||||
|
|
||||||
|
queryClient.setQueryData(LIST_CONVOS_KEY, (old: ConvoListQueryData) => {
|
||||||
|
if (!old) return old
|
||||||
|
|
||||||
|
const existingConvo = getConvoFromQueryData(convoId, old)
|
||||||
|
|
||||||
|
if (existingConvo) {
|
||||||
|
return {
|
||||||
|
...old,
|
||||||
|
pages: old.pages.map(page => {
|
||||||
|
return {
|
||||||
|
...page,
|
||||||
|
convos: page.convos.map(convo => {
|
||||||
|
if (convo.id === convoId) {
|
||||||
|
return {
|
||||||
|
...convo,
|
||||||
|
unreadCount: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return convo
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If we somehow marked a convo as read that doesn't exist in the
|
||||||
|
// list, then we don't need to do anything.
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export function useListConvosQuery({
|
|||||||
queryKey: RQKEY,
|
queryKey: RQKEY,
|
||||||
queryFn: async ({pageParam}) => {
|
queryFn: async ({pageParam}) => {
|
||||||
const {data} = await agent.api.chat.bsky.convo.listConvos(
|
const {data} = await agent.api.chat.bsky.convo.listConvos(
|
||||||
{cursor: pageParam},
|
{cursor: pageParam, limit: 20},
|
||||||
{headers: DM_SERVICE_HEADERS},
|
{headers: DM_SERVICE_HEADERS},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -47,9 +47,6 @@ export function useListConvosQuery({
|
|||||||
},
|
},
|
||||||
initialPageParam: undefined as RQPageParam,
|
initialPageParam: undefined as RQPageParam,
|
||||||
getNextPageParam: lastPage => lastPage.cursor,
|
getNextPageParam: lastPage => lastPage.cursor,
|
||||||
// refetch every 60 seconds since we can't get *all* info from the logs
|
|
||||||
// i.e. reading chats on another device won't update the unread count
|
|
||||||
refetchInterval: 60_000,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,6 +177,11 @@ export function ListConvosProviderInner({
|
|||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/**
|
||||||
|
* We received a message from an conversation old enough that
|
||||||
|
* it doesn't exist in the query cache, meaning we need to
|
||||||
|
* refetch and bump the old convo to the top.
|
||||||
|
*/
|
||||||
debouncedRefetch()
|
debouncedRefetch()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -245,12 +247,12 @@ export function useUnreadMessageCount() {
|
|||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
return {
|
return {
|
||||||
count,
|
count,
|
||||||
numUnread: count > 0 ? (count > 30 ? '30+' : String(count)) : undefined,
|
numUnread: count > 0 ? (count > 10 ? '10+' : String(count)) : undefined,
|
||||||
}
|
}
|
||||||
}, [count])
|
}, [count])
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConvoListQueryData = {
|
export type ConvoListQueryData = {
|
||||||
pageParams: Array<string | undefined>
|
pageParams: Array<string | undefined>
|
||||||
pages: Array<ChatBskyConvoListConvos.OutputSchema>
|
pages: Array<ChatBskyConvoListConvos.OutputSchema>
|
||||||
}
|
}
|
||||||
@@ -301,7 +303,7 @@ function optimisticDelete(chatId: string, old: ConvoListQueryData) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getConvoFromQueryData(chatId: string, old: ConvoListQueryData) {
|
export function getConvoFromQueryData(chatId: string, old: ConvoListQueryData) {
|
||||||
for (const page of old.pages) {
|
for (const page of old.pages) {
|
||||||
for (const convo of page.convos) {
|
for (const convo of page.convos) {
|
||||||
if (convo.id === chatId) {
|
if (convo.id === chatId) {
|
||||||
|
|||||||
Reference in New Issue
Block a user