Handle new group chat log events (#10624)

This commit is contained in:
DS Boyce
2026-05-27 09:32:06 -07:00
committed by GitHub
parent 4e4e1e1190
commit 721a08ffe1
2 changed files with 136 additions and 26 deletions
+107 -26
View File
@@ -259,18 +259,26 @@ export function ListConvosProviderInner({
queryClient.setQueriesData({queryKey: RQKEY('request')}, updateFn)
}
} else if (ChatBskyConvoDefs.isLogReadMessage(log)) {
const logRef: ChatBskyConvoDefs.LogReadMessage = log
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(logRef.convoId, old, convo => ({
optimisticUpdate(log.convoId, old, convo => ({
...convo,
unreadCount: 0,
rev: logRef.rev,
rev: log.rev,
})),
)
} else if (ChatBskyConvoDefs.isLogReadConvo(log)) {
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(log.convoId, old, convo => ({
...convo,
unreadCount: 0,
rev: log.rev,
})),
)
} else if (ChatBskyConvoDefs.isLogAcceptConvo(log)) {
const logRef: ChatBskyConvoDefs.LogAcceptConvo = log
const requests = queryClient.getQueryData<ConvoListQueryData>(
RQKEY('request'),
)
@@ -285,8 +293,7 @@ export function ListConvosProviderInner({
}
queryClient.setQueryData(
RQKEY('request'),
(old?: ConvoListQueryData) =>
optimisticDelete(logRef.convoId, old),
(old?: ConvoListQueryData) => optimisticDelete(log.convoId, old),
)
queryClient.setQueriesData(
{queryKey: RQKEY('accepted')},
@@ -313,67 +320,141 @@ export function ListConvosProviderInner({
},
)
} else if (ChatBskyConvoDefs.isLogMuteConvo(log)) {
const logRef: ChatBskyConvoDefs.LogMuteConvo = log
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(logRef.convoId, old, convo => ({
optimisticUpdate(log.convoId, old, convo => ({
...convo,
muted: true,
rev: logRef.rev,
rev: log.rev,
})),
)
} else if (ChatBskyConvoDefs.isLogUnmuteConvo(log)) {
const logRef: ChatBskyConvoDefs.LogUnmuteConvo = log
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(logRef.convoId, old, convo => ({
optimisticUpdate(log.convoId, old, convo => ({
...convo,
muted: false,
rev: logRef.rev,
rev: log.rev,
})),
)
} else if (ChatBskyConvoDefs.isLogAddReaction(log)) {
const logRef: ChatBskyConvoDefs.LogAddReaction = log
} else if (ChatBskyConvoDefs.isLogLockConvo(log)) {
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(logRef.convoId, old, convo => ({
optimisticUpdate(log.convoId, old, convo => {
if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) {
return {
...convo,
kind: {
...convo.kind,
lockStatus: 'locked',
},
rev: log.rev,
}
}
return {
...convo,
rev: log.rev,
}
}),
)
} else if (ChatBskyConvoDefs.isLogUnlockConvo(log)) {
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(log.convoId, old, convo => {
if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) {
return {
...convo,
kind: {
...convo.kind,
lockStatus: 'unlocked',
},
rev: log.rev,
}
}
return {
...convo,
rev: log.rev,
}
}),
)
} else if (ChatBskyConvoDefs.isLogLockConvoPermanently(log)) {
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(log.convoId, old, convo => {
if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) {
return {
...convo,
kind: {
...convo.kind,
lockStatus: 'locked-permanently',
},
rev: log.rev,
}
}
return {
...convo,
rev: log.rev,
}
}),
)
} else if (
ChatBskyConvoDefs.isLogCreateJoinLink(log) ||
ChatBskyConvoDefs.isLogEditJoinLink(log) ||
ChatBskyConvoDefs.isLogEnableJoinLink(log) ||
ChatBskyConvoDefs.isLogDisableJoinLink(log)
) {
// Join link data not included in the log event, trigger refetch to get it
debouncedRefetch()
} else if (
ChatBskyConvoDefs.isLogIncomingJoinRequest(log) ||
ChatBskyConvoDefs.isLogApproveJoinRequest(log) ||
ChatBskyConvoDefs.isLogRejectJoinRequest(log) ||
ChatBskyConvoDefs.isLogOutgoingJoinRequest(log)
) {
// TODO Update join request count here when available. -dsb
} else if (ChatBskyConvoDefs.isLogAddReaction(log)) {
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(log.convoId, old, convo => ({
...convo,
lastReaction: {
$type: 'chat.bsky.convo.defs#messageAndReactionView',
reaction: logRef.reaction,
message: logRef.message,
reaction: log.reaction,
message: log.message,
},
rev: logRef.rev,
rev: log.rev,
})),
)
} else if (ChatBskyConvoDefs.isLogRemoveReaction(log)) {
const logRef: ChatBskyConvoDefs.LogRemoveReaction = log
queryClient.setQueriesData(
{queryKey: [RQKEY_ROOT]},
(old?: ConvoListQueryData) =>
optimisticUpdate(logRef.convoId, old, convo => {
optimisticUpdate(log.convoId, old, convo => {
if (
// if the convo is the same
logRef.convoId === convo.id &&
log.convoId === convo.id &&
ChatBskyConvoDefs.isMessageAndReactionView(
convo.lastReaction,
) &&
ChatBskyConvoDefs.isMessageView(logRef.message) &&
ChatBskyConvoDefs.isMessageView(log.message) &&
// ...and the message is the same
convo.lastReaction.message.id === logRef.message.id &&
convo.lastReaction.message.id === log.message.id &&
// ...and the reaction is the same
convo.lastReaction.reaction.sender.did ===
logRef.reaction.sender.did &&
convo.lastReaction.reaction.value === logRef.reaction.value
log.reaction.sender.did &&
convo.lastReaction.reaction.value === log.reaction.value
) {
return {
...convo,
// ...remove the reaction. hopefully they didn't react twice in a row!
lastReaction: undefined,
rev: logRef.rev,
rev: log.rev,
}
} else {
return convo
@@ -76,6 +76,35 @@ export function useListConvoMembersQuery({
) {
mutateList(list => list.filter(m => m.did !== data.member.did))
}
} else if (ChatBskyConvoDefs.isLogMemberJoin(log)) {
const data = log.message.data
if (
bsky.dangerousIsType<ChatBskyConvoDefs.SystemMessageDataMemberJoin>(
data,
ChatBskyConvoDefs.isSystemMessageDataMemberJoin,
)
) {
const newMember = log.relatedProfiles.find(
r => r.did === data.member.did,
)
if (newMember) {
mutateList(list =>
list.some(m => m.did === newMember.did)
? list
: list.concat(newMember),
)
}
}
} else if (ChatBskyConvoDefs.isLogMemberLeave(log)) {
const data = log.message.data
if (
bsky.dangerousIsType<ChatBskyConvoDefs.SystemMessageDataMemberLeave>(
data,
ChatBskyConvoDefs.isSystemMessageDataMemberLeave,
)
) {
mutateList(list => list.filter(m => m.did !== data.member.did))
}
}
}
},