[Reactions] Get reactions in chat list working again with new lexicon (#8093)

* get chat list reactions working again with new lexicon

* fix weird android bug where background wasn't clipped
This commit is contained in:
Samuel Newman
2025-04-02 01:45:29 +03:00
committed by GitHub
parent 318b29d3fd
commit 5cb49314d0
5 changed files with 80 additions and 73 deletions
+1 -1
View File
@@ -58,7 +58,7 @@
"icons:optimize": "svgo -f ./assets/icons" "icons:optimize": "svgo -f ./assets/icons"
}, },
"dependencies": { "dependencies": {
"@atproto/api": "^0.14.14", "@atproto/api": "^0.14.16",
"@bitdrift/react-native": "^0.6.8", "@bitdrift/react-native": "^0.6.8",
"@braintree/sanitize-url": "^6.0.2", "@braintree/sanitize-url": "^6.0.2",
"@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet",
+3 -3
View File
@@ -95,9 +95,9 @@ export function EmojiReactionPicker({
? t.palette.negative_100 ? t.palette.negative_100
: t.palette.primary_500, : t.palette.primary_500,
} }
: alreadyReacted && { : alreadyReacted
backgroundColor: t.palette.primary_200, ? {backgroundColor: t.palette.primary_200}
}, : t.atoms.bg,
{height: 40, width: 40}, {height: 40, width: 40},
a.justify_center, a.justify_center,
a.align_center, a.align_center,
@@ -185,50 +185,61 @@ function ChatListItemReady({
lastMessageSentAt = convo.lastMessage.sentAt lastMessageSentAt = convo.lastMessage.sentAt
} }
if (ChatBskyConvoDefs.isDeletedMessageView(convo.lastMessage)) { if (ChatBskyConvoDefs.isDeletedMessageView(convo.lastMessage)) {
lastMessageSentAt = convo.lastMessage.sentAt
lastMessage = isDeletedAccount lastMessage = isDeletedAccount
? _(msg`Conversation deleted`) ? _(msg`Conversation deleted`)
: _(msg`Message deleted`) : _(msg`Message deleted`)
} }
if (ChatBskyConvoDefs.isMessageAndReactionView(convo.lastMessage)) {
const isFromMe =
convo.lastMessage.reaction.sender.did === currentAccount?.did
const lastMessageText = convo.lastMessage.message.text
const fallbackMessage = _(
msg({
message: 'a message',
comment: `If last message does not contain text, fall back to "{user} reacted to {a message}"`,
}),
)
if (isFromMe) { if (ChatBskyConvoDefs.isMessageAndReactionView(convo.lastReaction)) {
lastMessage = _( if (
msg`You reacted ${convo.lastMessage.reaction.value} to ${ !lastMessageSentAt ||
lastMessageText new Date(lastMessageSentAt) <
? `"${convo.lastMessage.message.text}"` new Date(convo.lastReaction.reaction.createdAt)
: fallbackMessage ) {
}`, const isFromMe =
convo.lastReaction.reaction.sender.did === currentAccount?.did
const lastMessageText = convo.lastReaction.message.text
const fallbackMessage = _(
msg({
message: 'a message',
comment: `If last message does not contain text, fall back to "{user} reacted to {a message}"`,
}),
) )
} else {
const senderDid = convo.lastMessage.reaction.sender.did if (isFromMe) {
const sender = convo.members.find(member => member.did === senderDid)
if (sender) {
lastMessage = _( lastMessage = _(
msg`${sanitizeDisplayName( msg`You reacted ${convo.lastReaction.reaction.value} to ${
sender.displayName || sender.handle,
)} reacted ${convo.lastMessage.reaction.value} to ${
lastMessageText lastMessageText
? `"${convo.lastMessage.message.text}"` ? `"${convo.lastReaction.message.text}"`
: fallbackMessage : fallbackMessage
}`, }`,
) )
} else { } else {
lastMessage = _( const senderDid = convo.lastReaction.reaction.sender.did
msg`Someone reacted ${convo.lastMessage.reaction.value} to ${ const sender = convo.members.find(
lastMessageText member => member.did === senderDid,
? `"${convo.lastMessage.message.text}"`
: fallbackMessage
}`,
) )
if (sender) {
lastMessage = _(
msg`${sanitizeDisplayName(
sender.displayName || sender.handle,
)} reacted ${convo.lastReaction.reaction.value} to ${
lastMessageText
? `"${convo.lastReaction.message.text}"`
: fallbackMessage
}`,
)
} else {
lastMessage = _(
msg`Someone reacted ${convo.lastReaction.reaction.value} to ${
lastMessageText
? `"${convo.lastReaction.message.text}"`
: fallbackMessage
}`,
)
}
} }
} }
} }
@@ -241,6 +252,7 @@ function ChatListItemReady({
}, [ }, [
_, _,
convo.lastMessage, convo.lastMessage,
convo.lastReaction,
currentAccount?.did, currentAccount?.did,
isDeletedAccount, isDeletedAccount,
convo.members, convo.members,
@@ -317,7 +317,7 @@ export function ListConvosProviderInner({
(old?: ConvoListQueryData) => (old?: ConvoListQueryData) =>
optimisticUpdate(logRef.convoId, old, convo => ({ optimisticUpdate(logRef.convoId, old, convo => ({
...convo, ...convo,
lastMessage: { lastReaction: {
$type: 'chat.bsky.convo.defs#messageAndReactionView', $type: 'chat.bsky.convo.defs#messageAndReactionView',
reaction: logRef.reaction, reaction: logRef.reaction,
message: logRef.message, message: logRef.message,
@@ -326,41 +326,36 @@ export function ListConvosProviderInner({
})), })),
) )
} else if (ChatBskyConvoDefs.isLogRemoveReaction(log)) { } else if (ChatBskyConvoDefs.isLogRemoveReaction(log)) {
if (ChatBskyConvoDefs.isMessageView(log.message)) { const logRef: ChatBskyConvoDefs.LogRemoveReaction = log
for (const [_queryKey, queryData] of queryClient.getQueriesData< queryClient.setQueriesData(
InfiniteData<ChatBskyConvoListConvos.OutputSchema> {queryKey: [RQKEY_ROOT]},
>({ (old?: ConvoListQueryData) =>
queryKey: [RQKEY_ROOT], optimisticUpdate(logRef.convoId, old, convo => {
})) { if (
if (!queryData?.pages) { // if the convo is the same
continue logRef.convoId === convo.id &&
} ChatBskyConvoDefs.isMessageAndReactionView(
convo.lastReaction,
for (const page of queryData.pages) { ) &&
for (const convo of page.convos) { ChatBskyConvoDefs.isMessageView(logRef.message) &&
if ( // ...and the message is the same
// if the convo is the same convo.lastReaction.message.id === logRef.message.id &&
log.convoId === convo.id && // ...and the reaction is the same
ChatBskyConvoDefs.isMessageAndReactionView( convo.lastReaction.reaction.sender.did ===
convo.lastMessage, logRef.reaction.sender.did &&
) && convo.lastReaction.reaction.value === logRef.reaction.value
ChatBskyConvoDefs.isMessageView( ) {
convo.lastMessage.message, return {
) && ...convo,
// ...and the message is the same // ...remove the reaction. hopefully they didn't react twice in a row!
convo.lastMessage.message.id === log.message.id && lastReaction: undefined,
// ...and the reaction is the same rev: logRef.rev,
convo.lastMessage.reaction.sender.did ===
log.reaction.sender.did &&
convo.lastMessage.reaction.value === log.reaction.value
) {
// refetch, because we don't know what the last message is now
debouncedRefetch()
} }
} else {
return convo
} }
} }),
} )
}
} }
} }
}, },
+4 -4
View File
@@ -80,10 +80,10 @@
tlds "^1.234.0" tlds "^1.234.0"
zod "^3.23.8" zod "^3.23.8"
"@atproto/api@^0.14.14": "@atproto/api@^0.14.16":
version "0.14.14" version "0.14.16"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.14.14.tgz#5d2d2e6156eab6ca0d463c114b4a3865275e9aac" resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.14.16.tgz#7b59eb83a27e906e0dc442d3de0f0d3869092b4a"
integrity sha512-ryawcnmazVSWYfq11ujPHauY77GfkM3mF0rZOkqENN2Ptnl6BZXJvpA0zLA/sQ5YBLcHXSEWg5Xdq+8i1l+8gA== integrity sha512-xzUK3KVdp1TDJJ09Di2rvS/fisVctvMHO7Er0XhYviL3V4lxGQPNT3pHwbTbbb22QP7xH/d5ghCgfdIoS5Z8/A==
dependencies: dependencies:
"@atproto/common-web" "^0.4.0" "@atproto/common-web" "^0.4.0"
"@atproto/lexicon" "^0.4.9" "@atproto/lexicon" "^0.4.9"