migrate the chat convo lifecycle mutations to the chat client

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Samuel Newman
2026-08-03 15:41:45 +03:00
parent 6b9b18cba4
commit 195c7a8d4a
7 changed files with 39 additions and 80 deletions
@@ -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
+9 -18
View File
@@ -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')
@@ -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)
@@ -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 =
@@ -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}) => {
@@ -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}) => {
@@ -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