From 195c7a8d4a52abe637a845db5e7ce60addf7902c Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 3 Aug 2026 15:41:45 +0300 Subject: [PATCH] migrate the chat convo lifecycle mutations to the chat client Co-Authored-By: Claude Fable 5 --- .../queries/messages/accept-conversation.ts | 13 +++------ src/state/queries/messages/conversation.ts | 27 +++++++------------ .../queries/messages/get-convo-for-members.ts | 17 ++++++------ .../queries/messages/leave-conversation.ts | 13 +++------ .../queries/messages/lock-conversation.ts | 18 ++++--------- .../queries/messages/mute-conversation.ts | 18 ++++--------- src/state/queries/messages/update-all-read.ts | 13 +++------ 7 files changed, 39 insertions(+), 80 deletions(-) diff --git a/src/state/queries/messages/accept-conversation.ts b/src/state/queries/messages/accept-conversation.ts index 668c7decc3..391f3e49f5 100644 --- a/src/state/queries/messages/accept-conversation.ts +++ b/src/state/queries/messages/accept-conversation.ts @@ -4,9 +4,9 @@ import { } from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import { type ConvoRequestListQueryData, optimisticDelete as optimisticDeleteRequest, @@ -34,16 +34,11 @@ export function useAcceptConversation( }, ) { const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationFn: async () => { - const {data} = await agent.chat.bsky.convo.acceptConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS}, - ) - - return data + return await client.call(chat.bsky.convo.acceptConvo, {convoId}) }, onMutate: () => { // snapshot every convo-list cache up front so onError can restore them diff --git a/src/state/queries/messages/conversation.ts b/src/state/queries/messages/conversation.ts index 1b7699c0ef..c0bf8f3551 100644 --- a/src/state/queries/messages/conversation.ts +++ b/src/state/queries/messages/conversation.ts @@ -11,10 +11,10 @@ import { useQueryClient, } from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' import {STALE} from '#/state/queries' import {useOnMarkAsRead} from '#/state/queries/messages/list-conversations' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import { RQKEY_PARTIAL as UNREAD_COUNTS_PARTIAL_KEY, UNREAD_ACCEPTED_CAP, @@ -30,15 +30,12 @@ export const RQKEY_ROOT = 'convo' export const RQKEY = (convoId: string) => [RQKEY_ROOT, convoId] export function useConvoQuery({convoId}: {convoId: string}) { - const agent = useAgent() + const client = useChatClient() return useQuery({ queryKey: RQKEY(convoId), queryFn: async () => { - const {data} = await agent.chat.bsky.convo.getConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS}, - ) + const data = await client.call(chat.bsky.convo.getConvo, {convoId}) return data.convo }, staleTime: STALE.INFINITY, @@ -55,7 +52,7 @@ export function precacheConvoQuery( export function useMarkAsReadMutation() { const optimisticUpdate = useOnMarkAsRead() const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationFn: async ({ @@ -67,16 +64,10 @@ export function useMarkAsReadMutation() { }) => { if (!convoId) throw new Error('No convoId provided') - await agent.chat.bsky.convo.updateRead( - { - convoId, - messageId, - }, - { - encoding: 'application/json', - headers: DM_SERVICE_HEADERS, - }, - ) + await client.call(chat.bsky.convo.updateRead, { + convoId, + messageId, + }) }, onMutate({convoId}) { if (!convoId) throw new Error('No convoId provided') diff --git a/src/state/queries/messages/get-convo-for-members.ts b/src/state/queries/messages/get-convo-for-members.ts index 58c1ab524a..441eb8b656 100644 --- a/src/state/queries/messages/get-convo-for-members.ts +++ b/src/state/queries/messages/get-convo-for-members.ts @@ -1,9 +1,9 @@ import {type ChatBskyConvoGetConvoForMembers} from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import {precacheConvoQuery} from './conversation' export function useGetConvoForMembers({ @@ -14,16 +14,15 @@ export function useGetConvoForMembers({ onError?: (error: Error) => void }) { const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationFn: async (members: string[]) => { - const {data} = await agent.chat.bsky.convo.getConvoForMembers( - {members: members}, - {headers: DM_SERVICE_HEADERS}, - ) - - return data + return await client.call(chat.bsky.convo.getConvoForMembers, { + // callers pass already-resolved actor dids + members: + members as chat.bsky.convo.getConvoForMembers.$Params['members'], + }) }, onSuccess: data => { precacheConvoQuery(queryClient, data.convo) diff --git a/src/state/queries/messages/leave-conversation.ts b/src/state/queries/messages/leave-conversation.ts index 51b51bde80..72379d8b30 100644 --- a/src/state/queries/messages/leave-conversation.ts +++ b/src/state/queries/messages/leave-conversation.ts @@ -4,10 +4,10 @@ import { } from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {invalidateJoinLinkPreviewsForConvo} from '#/state/queries/join-links' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import { type ConvoRequestListQueryData, optimisticDelete as optimisticDeleteRequest, @@ -38,19 +38,14 @@ export function useLeaveConvo( }, ) { const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationKey: RQKEY(convoId), mutationFn: async () => { if (!convoId) throw new Error('No convoId provided') - const {data} = await agent.chat.bsky.convo.leaveConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, - ) - - return data + return await client.call(chat.bsky.convo.leaveConvo, {convoId}) }, onMutate: () => { const prevConvoListQueries = diff --git a/src/state/queries/messages/lock-conversation.ts b/src/state/queries/messages/lock-conversation.ts index 122c0633b4..13242d59db 100644 --- a/src/state/queries/messages/lock-conversation.ts +++ b/src/state/queries/messages/lock-conversation.ts @@ -1,8 +1,8 @@ import {ChatBskyConvoDefs, type ChatBskyConvoLockConvo} from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import { rollbackConvoOptimistic, updateConvoOptimistic, @@ -25,23 +25,15 @@ export function useLockConvo( }, ) { const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationFn: async ({lock}: {lock: boolean; silent?: boolean}) => { if (!convoId) throw new Error('No convoId provided') if (lock) { - const {data} = await agent.chat.bsky.convo.lockConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, - ) - return data + return await client.call(chat.bsky.convo.lockConvo, {convoId}) } else { - const {data} = await agent.chat.bsky.convo.unlockConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, - ) - return data + return await client.call(chat.bsky.convo.unlockConvo, {convoId}) } }, onMutate: ({lock}) => { diff --git a/src/state/queries/messages/mute-conversation.ts b/src/state/queries/messages/mute-conversation.ts index 03a9ab0b4a..2e9e911b5e 100644 --- a/src/state/queries/messages/mute-conversation.ts +++ b/src/state/queries/messages/mute-conversation.ts @@ -1,8 +1,8 @@ import {type ChatBskyConvoMuteConvo} from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import { rollbackConvoOptimistic, updateConvoOptimistic, @@ -19,23 +19,15 @@ export function useMuteConvo( }, ) { const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationFn: async ({mute}: {mute: boolean}) => { if (!convoId) throw new Error('No convoId provided') if (mute) { - const {data} = await agent.chat.bsky.convo.muteConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, - ) - return data + return await client.call(chat.bsky.convo.muteConvo, {convoId}) } else { - const {data} = await agent.chat.bsky.convo.unmuteConvo( - {convoId}, - {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, - ) - return data + return await client.call(chat.bsky.convo.unmuteConvo, {convoId}) } }, onMutate: ({mute}) => { diff --git a/src/state/queries/messages/update-all-read.ts b/src/state/queries/messages/update-all-read.ts index 6fbffc58cd..afcb062d16 100644 --- a/src/state/queries/messages/update-all-read.ts +++ b/src/state/queries/messages/update-all-read.ts @@ -1,9 +1,9 @@ import {type ChatBskyConvoGetUnreadCounts} from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' -import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' -import {useAgent} from '#/state/session' +import {useChatClient} from '#/state/session' +import {chat} from '#/lexicons' import {RQKEY_PARTIAL as UNREAD_COUNTS_PARTIAL_KEY} from './get-unread-counts' import { type ConvoRequestListQueryData, @@ -29,16 +29,11 @@ export function useUpdateAllRead( }, ) { const queryClient = useQueryClient() - const agent = useAgent() + const client = useChatClient() return useMutation({ mutationFn: async () => { - const {data} = await agent.chat.bsky.convo.updateAllRead( - {status}, - {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, - ) - - return data + return await client.call(chat.bsky.convo.updateAllRead, {status}) }, onMutate: () => { // snapshot every convo-list cache up front so onError can restore them