import type { AnyProfileView, ChatBskyConvoDefs } from '@atcute/bluesky';
import { isDidBlockedInConvo } from '#/components/dms/getMessageInfo';
import { m } from '#/paraglide/messages';
export type UserReactionInfo = {
message: string;
createdAt: string;
isBlocked: boolean;
};
export function getReactionInfo({
convo,
currentAccountDid,
primaryProfile,
}: {
convo: ChatBskyConvoDefs.ConvoView;
currentAccountDid: string | undefined;
primaryProfile?: AnyProfileView;
}): UserReactionInfo | null {
if (convo.lastReaction?.$type !== 'chat.bsky.convo.defs#messageAndReactionView') {
return null;
}
const { reaction, message: reactedTo } = convo.lastReaction;
const isFromMe = reaction.sender.did === currentAccountDid;
const senderDid = reaction.sender.did;
const sender = convo.members.find((member) => member.did === senderDid);
const name = sender?.handle ?? null;
// Hide the preview when either the reactor or the author of the reacted-to message is blocked —
// otherwise a blocked reactor's name or a blocked sender's message text would leak into the chat list.
const isBlocked =
isDidBlockedInConvo({
did: senderDid,
members: convo.members,
primaryProfile,
}) ||
isDidBlockedInConvo({
did: reactedTo.sender?.did,
members: convo.members,
primaryProfile,
});
const lastMessageText = reactedTo.text;
const target = lastMessageText ? `"${lastMessageText}"` : m['components.dms.message.preview.fallback']();
let message: string;
if (isFromMe) {
message = m['components.dms.update.youReactedTo']({ target, value: reaction.value });
} else if (name) {
message = m['components.dms.reaction.reactedTo']({ name, reaction: reaction.value, target });
} else {
message = m['components.dms.update.someoneReactedTo']({ target, value: reaction.value });
}
return {
message,
createdAt: reaction.createdAt,
isBlocked,
};
}