From 876e20166a0accfe48b1064f65ebb8082a8f1167 Mon Sep 17 00:00:00 2001
From: DS Boyce <260543580+ds-boyce@users.noreply.github.com>
Date: Thu, 19 Mar 2026 06:18:48 -0700
Subject: [PATCH] Ensure mute state stays in sync after mutation (#10067)
---
src/state/messages/convo/agent.ts | 10 +++++
src/state/messages/convo/index.tsx | 15 +++++++
.../queries/messages/mute-conversation.ts | 39 +++++++++++++++----
3 files changed, 56 insertions(+), 8 deletions(-)
diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts
index 14fb73f849..d29049c872 100644
--- a/src/state/messages/convo/agent.ts
+++ b/src/state/messages/convo/agent.ts
@@ -850,6 +850,16 @@ export class Convo {
this.commit()
}
+ updateMuted(muted: boolean) {
+ if (this.convo) {
+ this.convo = {
+ ...this.convo,
+ muted,
+ }
+ }
+ this.commit()
+ }
+
async processPendingMessages() {
logger.debug(
`processing messages (${this.pendingMessages.size} remaining)`,
diff --git a/src/state/messages/convo/index.tsx b/src/state/messages/convo/index.tsx
index 215f5ed2ad..4117aef2ed 100644
--- a/src/state/messages/convo/index.tsx
+++ b/src/state/messages/convo/index.tsx
@@ -119,5 +119,20 @@ export function ConvoProvider({
})
}, [convo, queryClient])
+ useEffect(() => {
+ const [root, id] = getConvoKey(convoId)
+ return queryClient.getQueryCache().subscribe(event => {
+ const queryKey = event.query.queryKey as string[]
+ if (queryKey[0] === root && queryKey[1] === id) {
+ const data = event.query.state.data as
+ | ChatBskyConvoDefs.ConvoView
+ | undefined
+ if (data && convo.convo && data.muted !== convo.convo.muted) {
+ convo.updateMuted(data.muted)
+ }
+ }
+ })
+ }, [convo, convoId, queryClient])
+
return {children}
}
diff --git a/src/state/queries/messages/mute-conversation.ts b/src/state/queries/messages/mute-conversation.ts
index d668e36cb0..08878d7fb5 100644
--- a/src/state/queries/messages/mute-conversation.ts
+++ b/src/state/queries/messages/mute-conversation.ts
@@ -44,39 +44,62 @@ export function useMuteConvo(
return data
}
},
- onSuccess: (data, params) => {
+ onMutate: ({mute}) => {
+ if (!convoId) return
+
+ const prevConvo = queryClient.getQueryData(
+ CONVO_KEY(convoId),
+ )
+ const prevListEntries = queryClient.getQueriesData<
+ InfiniteData
+ >({queryKey: [CONVO_LIST_KEY]})
+
+ // Update for a single chat thread
queryClient.setQueryData(
- CONVO_KEY(data.convo.id),
+ CONVO_KEY(convoId),
prev => {
if (!prev) return
return {
...prev,
- muted: params.mute,
+ muted: mute,
}
},
)
- queryClient.setQueryData<
+
+ // Update for the chat list
+ queryClient.setQueriesData<
InfiniteData
- >([CONVO_LIST_KEY], prev => {
+ >({queryKey: [CONVO_LIST_KEY]}, prev => {
if (!prev?.pages) return
return {
...prev,
pages: prev.pages.map(page => ({
...page,
convos: page.convos.map(convo => {
- if (convo.id !== data.convo.id) return convo
+ if (convo.id !== convoId) return convo
return {
...convo,
- muted: params.mute,
+ muted: mute,
}
}),
})),
}
})
+ return {prevConvo, prevListEntries}
+ },
+ onSuccess: data => {
onSuccess?.(data)
},
- onError: e => {
+ onError: (e, _variables, context) => {
+ if (context?.prevConvo && convoId) {
+ queryClient.setQueryData(CONVO_KEY(convoId), context.prevConvo)
+ }
+ if (context?.prevListEntries) {
+ for (const [key, data] of context.prevListEntries) {
+ queryClient.setQueryData(key, data)
+ }
+ }
onError?.(e)
},
})