"use client"; /** * ImageBubble 图片气泡 * * 支持: * - base64 data URI 解码(`data:image/png;base64,...`) * - 点击 → 通知聊天页打开页内全屏查看器 * - 错误占位符(broken image icon) */ import { ChatMediaImage } from "./chat-media-image"; export interface ImageBubbleProps { characterId: string; displayMessageId: string; remoteMessageId?: string; imageUrl: string; // base64 data URI 或 URL imagePaywalled?: boolean; onOpenImage?: (displayMessageId: string) => void; } export function ImageBubble({ characterId, displayMessageId, remoteMessageId, imageUrl, imagePaywalled = false, onOpenImage, }: ImageBubbleProps) { const canOpen = Boolean(onOpenImage); const imageClassName = [ "block h-auto w-full object-cover", imagePaywalled ? "scale-104 blur-sm" : "", ] .filter(Boolean) .join(" "); const openImage = () => { if (!onOpenImage) return; onOpenImage(displayMessageId); }; return (
{ if (!canOpen) return; if (e.key === "Enter" || e.key === " ") { e.preventDefault(); openImage(); } }} aria-label={canOpen ? "Open image in fullscreen" : undefined} > {imagePaywalled ? ( ); }