revalidate join links on leave
This commit is contained in:
@@ -76,6 +76,35 @@ export function invalidateJoinLinkPreviewsForCode(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invalidate any join link preview queries that resolved to the given convo.
|
||||||
|
* The code isn't always known to the viewer (e.g. when they're a regular
|
||||||
|
* member), so we match on the convoId carried by the resolved preview instead.
|
||||||
|
* Use this when the viewer's membership changes (e.g. they leave or are removed)
|
||||||
|
* so cached previews refetch and reflect their new viewer state.
|
||||||
|
*/
|
||||||
|
export function invalidateJoinLinkPreviewsForConvo(
|
||||||
|
queryClient: QueryClient,
|
||||||
|
convoId: string,
|
||||||
|
) {
|
||||||
|
return queryClient.invalidateQueries({
|
||||||
|
predicate: query => {
|
||||||
|
const [root] = query.queryKey
|
||||||
|
if (root !== joinLinkPreviewQueryKeyRoot) return false
|
||||||
|
const data = query.state.data as
|
||||||
|
| ChatBskyGroupGetJoinLinkPreviews.OutputSchema
|
||||||
|
| undefined
|
||||||
|
return (
|
||||||
|
data?.joinLinkPreviews.some(
|
||||||
|
preview =>
|
||||||
|
ChatBskyGroupDefs.isJoinLinkPreviewView(preview) &&
|
||||||
|
preview.convoId === convoId,
|
||||||
|
) ?? false
|
||||||
|
)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
async function fetchJoinLinkPreviews({
|
async function fetchJoinLinkPreviews({
|
||||||
agent,
|
agent,
|
||||||
codes,
|
codes,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
|
|
||||||
import {DM_SERVICE_HEADERS} from '#/lib/constants'
|
import {DM_SERVICE_HEADERS} from '#/lib/constants'
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
|
import {invalidateJoinLinkPreviewsForConvo} from '#/state/queries/join-links'
|
||||||
import {useAgent} from '#/state/session'
|
import {useAgent} from '#/state/session'
|
||||||
import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations'
|
import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations'
|
||||||
|
|
||||||
@@ -72,6 +73,9 @@ export function useLeaveConvo(
|
|||||||
},
|
},
|
||||||
onSuccess: data => {
|
onSuccess: data => {
|
||||||
void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]})
|
void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]})
|
||||||
|
if (convoId) {
|
||||||
|
void invalidateJoinLinkPreviewsForConvo(queryClient, convoId)
|
||||||
|
}
|
||||||
onSuccess?.(data)
|
onSuccess?.(data)
|
||||||
},
|
},
|
||||||
onError: (error, _, context) => {
|
onError: (error, _, context) => {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import {DM_SERVICE_HEADERS} from '#/lib/constants'
|
|||||||
import {useCurrentConvoId} from '#/state/messages/current-convo-id'
|
import {useCurrentConvoId} from '#/state/messages/current-convo-id'
|
||||||
import {useMessagesEventBus} from '#/state/messages/events'
|
import {useMessagesEventBus} from '#/state/messages/events'
|
||||||
import {useModerationOpts} from '#/state/preferences/moderation-opts'
|
import {useModerationOpts} from '#/state/preferences/moderation-opts'
|
||||||
|
import {invalidateJoinLinkPreviewsForConvo} from '#/state/queries/join-links'
|
||||||
import {useAgent, useSession} from '#/state/session'
|
import {useAgent, useSession} from '#/state/session'
|
||||||
import {parseConvoView} from '#/components/dms/util'
|
import {parseConvoView} from '#/components/dms/util'
|
||||||
import {useAgeAssurance} from '#/ageAssurance'
|
import {useAgeAssurance} from '#/ageAssurance'
|
||||||
@@ -257,6 +258,11 @@ export function ListConvosProviderInner({
|
|||||||
debouncedRefetch()
|
debouncedRefetch()
|
||||||
} else if (ChatBskyConvoDefs.isLogLeaveConvo(log)) {
|
} else if (ChatBskyConvoDefs.isLogLeaveConvo(log)) {
|
||||||
deleteConvoFromAllLists(log.convoId)
|
deleteConvoFromAllLists(log.convoId)
|
||||||
|
// The viewer is no longer in this convo (they left on another
|
||||||
|
// device, or were removed - removed members receive a
|
||||||
|
// logLeaveConvo, not a logRemoveMember). Refetch any cached join
|
||||||
|
// link preview so its viewer state reflects the lost membership.
|
||||||
|
void invalidateJoinLinkPreviewsForConvo(queryClient, log.convoId)
|
||||||
} else if (ChatBskyConvoDefs.isLogDeleteMessage(log)) {
|
} else if (ChatBskyConvoDefs.isLogDeleteMessage(log)) {
|
||||||
updateConvoInAllLists(log.convoId, convo => {
|
updateConvoInAllLists(log.convoId, convo => {
|
||||||
if (
|
if (
|
||||||
|
|||||||
Reference in New Issue
Block a user