From dc87c20a6e31092587c7aea60a68ee1f20a2d742 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 24 Apr 2026 15:57:37 +0300 Subject: [PATCH] mutate convo member list when logs come in --- .../queries/messages/list-conversations.tsx | 4 +- .../queries/messages/list-convo-members.ts | 62 ++++++++++++++++++- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 4c21bbbfeb..1c93ee565e 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -105,8 +105,8 @@ export function ListConvosProviderInner({ const debouncedRefetch = useMemo(() => { const refetchAndInvalidate = () => { - refetch() - queryClient.invalidateQueries({queryKey: [RQKEY_ROOT]}) + void refetch() + void queryClient.invalidateQueries({queryKey: [RQKEY_ROOT]}) } return throttle(refetchAndInvalidate, 500, { leading: true, diff --git a/src/state/queries/messages/list-convo-members.ts b/src/state/queries/messages/list-convo-members.ts index b353107927..19564017db 100644 --- a/src/state/queries/messages/list-convo-members.ts +++ b/src/state/queries/messages/list-convo-members.ts @@ -1,9 +1,12 @@ -import {type ChatBskyActorDefs} from '@atproto/api' -import {useQuery} from '@tanstack/react-query' +import {useEffect} from 'react' +import {type ChatBskyActorDefs, ChatBskyConvoDefs} from '@atproto/api' +import {useQuery, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {useMessagesEventBus} from '#/state/messages/events' import {STALE} from '#/state/queries' import {useAgent} from '#/state/session' +import * as bsky from '#/types/bsky' import {RQKEY_ROOT as GET_CONVOS_KEY} from './conversation' export const RQKEY_SEGMENT = 'members' @@ -24,6 +27,61 @@ export function useListConvoMembersQuery({ placeholderData?: ChatBskyActorDefs.ProfileViewBasic[] }) { const agent = useAgent() + const queryClient = useQueryClient() + const messagesBus = useMessagesEventBus() + + useEffect(() => { + const unsub = messagesBus.on( + ev => { + if (ev.type !== 'logs') return + + function mutateList( + fn: ( + update: ChatBskyActorDefs.ProfileViewBasic[], + ) => ChatBskyActorDefs.ProfileViewBasic[], + ) { + queryClient.setQueryData( + RQKEY(convoId), + old => { + if (!old) return // query doesn't exist yet, skip + return fn(old) + }, + ) + } + + for (const log of ev.logs) { + if (ChatBskyConvoDefs.isLogAddMember(log)) { + const data = log.message.data + if ( + bsky.dangerousIsType( + data, + ChatBskyConvoDefs.isSystemMessageDataAddMember, + ) + ) { + const newMember = log.relatedProfiles.find( + r => r.did === data.member.did, + ) + if (newMember) { + mutateList(list => list.concat(newMember)) + } + } + } else if (ChatBskyConvoDefs.isLogRemoveMember(log)) { + const data = log.message.data + if ( + bsky.dangerousIsType( + data, + ChatBskyConvoDefs.isSystemMessageDataRemoveMember, + ) + ) { + mutateList(list => list.filter(m => m.did !== data.member.did)) + } + } + } + }, + {convoId}, + ) + return () => unsub() + }, [convoId, messagesBus, queryClient]) return useQuery({ queryKey: RQKEY(convoId),