diff --git a/src/components/dms/MessageItem.tsx b/src/components/dms/MessageItem.tsx index 7628354af8..7706e9cec8 100644 --- a/src/components/dms/MessageItem.tsx +++ b/src/components/dms/MessageItem.tsx @@ -101,9 +101,7 @@ let MessageItem = ({ const moderationOpts = useModerationOpts() const queryClient = useQueryClient() - const profile = item.relatedProfiles.find( - p => p.did === item.message.sender.did, - ) + const profile = item.relatedProfiles.get(item.message.sender.did) const reactionsControl = useDialogControl() const reactionTapRef = useRef(false) @@ -276,7 +274,7 @@ let MessageItem = ({ return l`You reacted ${reaction.value}` } else { const senderDid = reaction.sender.did - const memberSender = item.relatedProfiles.find(p => p.did === senderDid) + const memberSender = item.relatedProfiles.get(senderDid) if (memberSender) { return l`${createSanitizedDisplayName(memberSender)} reacted ${reaction.value}` } @@ -378,7 +376,7 @@ let MessageItem = ({ ) : null} message: ChatBskyConvoDefs.MessageView reactions?: ChatBskyConvoDefs.ReactionView[] groupedReactions?: Reaction[] @@ -100,7 +100,7 @@ export function ReactionsDialog({ return 0 }) .map(reaction => { - const sender = members.find(m => m.did === reaction.sender.did) + const sender = relatedProfiles.get(reaction.sender.did) if (!sender) return null return ( , ): string | null { - const profile = relatedProfiles.find(p => p.did === user.did) + const profile = relatedProfiles.get(user.did) return profile ? createSanitizedDisplayName(profile) : null } export function getSystemMessageInfo( data: ChatBskyConvoDefs.SystemMessageView['data'], - relatedProfiles: bsky.profile.AnyProfileView[], + relatedProfiles: Map, ): SystemMessageInfo | null { if (ChatBskyConvoDefs.isSystemMessageDataAddMember(data)) { const name = getReferredDisplayName(data.member, relatedProfiles) diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index 7cedb5d4be..842332dede 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -298,7 +298,10 @@ function BaseChatItem({ // System message if (ChatBskyConvoDefs.isSystemMessageView(convo.lastMessage)) { - const info = getSystemMessageInfo(convo.lastMessage.data, convo.members) + const info = getSystemMessageInfo( + convo.lastMessage.data, + new Map(convo.members.map(m => [m.did, m])), + ) if (info) { lastMessage = i18n._(info.message) lastMessageSentAt = convo.lastMessage.sentAt diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts index 28220b6f72..9cba1ec72a 100644 --- a/src/state/messages/convo/agent.ts +++ b/src/state/messages/convo/agent.ts @@ -43,7 +43,6 @@ import { parseConvoView, } from '#/components/dms/util' import {IS_NATIVE} from '#/env' -import type * as bsky from '#/types/bsky' const logger = Logger.create(Logger.Context.ConversationAgent) @@ -108,7 +107,8 @@ export class Convo { {id: string; message: ChatBskyConvoSendMessage.InputSchema['message']} > = new Map() private deletedMessages: Set = new Set() - private relatedProfiles: Map = new Map() + private relatedProfiles: Map = + new Map() private isProcessingPendingMessages = false @@ -1172,44 +1172,6 @@ export class Convo { } } - private getRelatedProfilesForItem( - m: - | ChatBskyConvoDefs.MessageView - | ChatBskyConvoDefs.DeletedMessageView - | ChatBskyConvoDefs.SystemMessageView, - ): bsky.profile.AnyProfileView[] { - const seen = new Set() - const profiles: bsky.profile.AnyProfileView[] = [] - - const add = (did: string) => { - if (seen.has(did)) return - seen.add(did) - const p = this.relatedProfiles.get(did) - if (p) profiles.push(p) - } - - if (ChatBskyConvoDefs.isMessageView(m)) { - add(m.sender.did) - if (m.reactions) { - for (const reaction of m.reactions) { - add(reaction.sender.did) - } - } - } else if (ChatBskyConvoDefs.isDeletedMessageView(m)) { - add(m.sender.did) - } else if (ChatBskyConvoDefs.isSystemMessageView(m)) { - const data = m.data - if ('member' in data && data.member?.did) { - add(data.member.did) - } - if ('addedBy' in data && data.addedBy?.did) { - add(data.addedBy.did) - } - } - - return profiles - } - /* * Items in reverse order, since FlatList inverts */ @@ -1222,7 +1184,7 @@ export class Convo { type: 'message', key: m.id, message: m, - relatedProfiles: this.getRelatedProfilesForItem(m), + relatedProfiles: this.relatedProfiles, nextMessage: null, prevMessage: null, }) @@ -1231,7 +1193,7 @@ export class Convo { type: 'deleted-message', key: m.id, message: m, - relatedProfiles: this.getRelatedProfilesForItem(m), + relatedProfiles: this.relatedProfiles, nextMessage: null, prevMessage: null, }) @@ -1240,7 +1202,7 @@ export class Convo { type: 'system-message', key: m.id, message: m, - relatedProfiles: this.getRelatedProfilesForItem(m), + relatedProfiles: this.relatedProfiles, }) } }) @@ -1262,7 +1224,7 @@ export class Convo { type: 'message', key: m.id, message: m, - relatedProfiles: this.getRelatedProfilesForItem(m), + relatedProfiles: this.relatedProfiles, nextMessage: null, prevMessage: null, }) @@ -1271,7 +1233,7 @@ export class Convo { type: 'deleted-message', key: m.id, message: m, - relatedProfiles: this.getRelatedProfilesForItem(m), + relatedProfiles: this.relatedProfiles, nextMessage: null, prevMessage: null, }) @@ -1280,13 +1242,12 @@ export class Convo { type: 'system-message', key: m.id, message: m, - relatedProfiles: this.getRelatedProfilesForItem(m), + relatedProfiles: this.relatedProfiles, }) } }) this.pendingMessages.forEach(m => { - const senderProfile = this.relatedProfiles.get(this.senderUserDid) items.push({ type: 'pending-message', key: m.id, @@ -1302,7 +1263,7 @@ export class Convo { did: this.senderUserDid, }, }, - relatedProfiles: senderProfile ? [senderProfile] : [], + relatedProfiles: this.relatedProfiles, nextMessage: null, prevMessage: null, failed: this.pendingMessageFailure !== null, diff --git a/src/state/messages/convo/types.ts b/src/state/messages/convo/types.ts index 8b25cdeab6..ad98afc3da 100644 --- a/src/state/messages/convo/types.ts +++ b/src/state/messages/convo/types.ts @@ -1,12 +1,12 @@ import { type BskyAgent, + type ChatBskyActorDefs, type ChatBskyConvoDefs, type ChatBskyConvoSendMessage, } from '@atproto/api' import {type MessagesEventBus} from '#/state/messages/events/agent' import {type ConvoWithDetails} from '#/components/dms/util' -import type * as bsky from '#/types/bsky' export type ConvoParams = { convoId: string @@ -59,35 +59,20 @@ export enum ConvoDispatchEvent { } export type ConvoDispatch = - | { - event: ConvoDispatchEvent.Init - } - | { - event: ConvoDispatchEvent.Ready - } - | { - event: ConvoDispatchEvent.Resume - } - | { - event: ConvoDispatchEvent.Background - } - | { - event: ConvoDispatchEvent.Suspend - } - | { - event: ConvoDispatchEvent.Error - payload: ConvoError - } - | { - event: ConvoDispatchEvent.Disable - } + | {event: ConvoDispatchEvent.Init} + | {event: ConvoDispatchEvent.Ready} + | {event: ConvoDispatchEvent.Resume} + | {event: ConvoDispatchEvent.Background} + | {event: ConvoDispatchEvent.Suspend} + | {event: ConvoDispatchEvent.Error; payload: ConvoError} + | {event: ConvoDispatchEvent.Disable} export type ConvoItem = | { type: 'message' key: string message: ChatBskyConvoDefs.MessageView - relatedProfiles: bsky.profile.AnyProfileView[] + relatedProfiles: Map nextMessage: | ChatBskyConvoDefs.MessageView | ChatBskyConvoDefs.DeletedMessageView @@ -101,7 +86,7 @@ export type ConvoItem = type: 'pending-message' key: string message: ChatBskyConvoDefs.MessageView - relatedProfiles: bsky.profile.AnyProfileView[] + relatedProfiles: Map nextMessage: | ChatBskyConvoDefs.MessageView | ChatBskyConvoDefs.DeletedMessageView @@ -120,7 +105,7 @@ export type ConvoItem = type: 'deleted-message' key: string message: ChatBskyConvoDefs.DeletedMessageView - relatedProfiles: bsky.profile.AnyProfileView[] + relatedProfiles: Map nextMessage: | ChatBskyConvoDefs.MessageView | ChatBskyConvoDefs.DeletedMessageView @@ -134,7 +119,7 @@ export type ConvoItem = type: 'system-message' key: string message: ChatBskyConvoDefs.SystemMessageView - relatedProfiles: bsky.profile.AnyProfileView[] + relatedProfiles: Map } | { type: 'error'