import type { MessageRecord } from "../../../entities/message/types.js"; import { parseMetadata } from "../../../shared/lib/utils.js"; import { EmptyStateMascot } from "../../../widgets/mascot/MascotImage"; interface ImageItem { url: string; title: string; kind: "attachment" | "embed" | "sticker"; message: MessageRecord; } function kindBadge(kind: ImageItem["kind"]): string { switch (kind) { case "sticker": return "bg-primary/10 text-primary border-primary/20"; case "attachment": return "bg-primary-soft text-primary border-primary/30"; case "embed": return "bg-purple-100 text-purple-700 border-purple-200"; } } export function ImageGrid({ messages }: { messages: MessageRecord[] }) { const images: ImageItem[] = []; for (const message of messages) { const metadata = parseMetadata(message.metadata); // Stickers for (const sticker of metadata.stickers ?? []) { if (sticker.url) { images.push({ url: sticker.url, title: sticker.name || "sticker", kind: "sticker", message, }); } } // Attachments for (const attachment of metadata.attachments ?? []) { if ( attachment.url && (attachment.contentType?.startsWith("image/") || /\.(png|jpe?g|gif|webp)$/i.test(attachment.name)) ) { images.push({ url: attachment.url, title: attachment.name, kind: "attachment", message, }); } } // Embed images for (const embed of metadata.embeds ?? []) { for (const imgUrl of [embed.image, embed.thumbnail].filter(Boolean)) { images.push({ url: imgUrl as string, title: embed.title || "embed image", kind: "embed", message, }); } } } if (images.length === 0) { return ; } return (
{images.map((image) => { // Stable key using message.id + url const stableKey = `${image.message.id}-${image.kind}-${image.url}`; return (
{image.kind === "sticker" ? ( {image.title} ) : ( {image.title} )} {image.kind}
{image.title}
{image.message.username}
); })}
); }