'use client'; import type { ChatMessage } from '@/lib/api'; import { MediaImageSkeleton } from '@/components/ui/media-image-skeleton'; import { parseChatMediaMetadata } from '@/lib/chat-media-album'; import { cn } from '@/lib/utils'; interface ChatMediaAlbumGridProps { messages: ChatMessage[]; mediaUrls: Record; className?: string; onImageClick?: (message: ChatMessage, index: number) => void; } function tileClass(count: number, index: number) { if (count === 1) return 'col-span-2 row-span-2'; if (count === 2) return 'col-span-1 row-span-2'; if (count === 3) { if (index === 0) return 'col-span-1 row-span-2'; return 'col-span-1 row-span-1'; } if (count === 4) return 'col-span-1 row-span-1'; if (count === 5) { if (index === 0) return 'col-span-2 row-span-2'; return 'col-span-1 row-span-1'; } if (count >= 6) { if (index === 0) return 'col-span-2 row-span-2'; return 'col-span-1 row-span-1'; } return 'col-span-1 row-span-1'; } export function ChatMediaAlbumGrid({ messages, mediaUrls, className, onImageClick }: ChatMediaAlbumGridProps) { const imageMessages = messages.filter((message) => message.type === 'IMAGE' && message.storageKey); const fileMessages = messages.filter((message) => message.type === 'FILE' && message.storageKey); const count = imageMessages.length; if (!count && fileMessages.length) { return (
{fileMessages.map((message) => (
{message.content || parseChatMediaMetadata(message.metadataJson).fileName || 'Файл'}
))}
); } return (
{imageMessages.map((message, index) => { const media = message.storageKey ? mediaUrls[message.storageKey] : undefined; const hiddenCount = count > 6 && index === 5 ? count - 6 : 0; const isLoading = !media?.blobUrl || media.status === 'loading'; return ( ); })}
); }