'use client'; import type { ReactNode } from 'react'; import { Loader2, Trash2 } from 'lucide-react'; import { ChatMediaAlbumGrid } from '@/components/chat/chat-media-album-grid'; import { MediaImageSkeleton } from '@/components/ui/media-image-skeleton'; import { AdminChatMessage, ChatMessage } from '@/lib/api'; import { groupChatMessagesForDisplay, parseChatMediaMetadata } from '@/lib/chat-media-album'; import { cn } from '@/lib/utils'; import { AdminChatMediaEntry, adminMessageToChatMessage } from '@/components/admin/use-admin-chat-media'; function AdminImageBubble({ message, media, onOpen }: { message: ChatMessage; media?: AdminChatMediaEntry; onOpen: () => void; }) { const meta = parseChatMediaMetadata(message.metadataJson); const fileName = meta.fileName || message.content || 'Фото'; if (media?.status === 'error') { return

{media.errorMessage ?? 'Фото недоступно'}

; } if (!media?.blobUrl || media.status === 'loading') { return ; } return ( ); } export function AdminInspectorMessageBody({ messages, roomId, mediaUrls, onOpenImage }: { messages: AdminChatMessage[]; roomId: string; mediaUrls: Record; onOpenImage: (message: ChatMessage) => void; }) { const chatMessages = messages.map((message) => adminMessageToChatMessage(message, roomId)); const displayItems = groupChatMessagesForDisplay(chatMessages); return (
{displayItems.map((item) => { if (item.kind === 'album') { const captionMessage = item.messages.find((message) => message.content?.trim()); return (
onOpenImage(message)} /> {captionMessage?.content ? (

{captionMessage.content}

) : null}
); } const message = item.message; const adminMessage = messages.find((entry) => entry.id === message.id); if (!adminMessage) return null; if (message.isEncrypted) { return (

[E2E недоступно для модерации]

); } if (message.storageKey && message.type === 'IMAGE') { return ( onOpenImage(message)} /> ); } if (message.type === 'FILE' && message.storageKey) { const meta = parseChatMediaMetadata(message.metadataJson); return (

📎 {meta.fileName || message.content || 'Файл'}

); } if (message.type === 'VOICE' || message.type === 'AUDIO') { return (

🎤 Голосовое сообщение

); } if (message.type === 'POLL') { return (

📊 Опрос

); } const text = adminMessage.content?.trim() || adminMessage.preview; if (!text || text === '[Пустое сообщение]') { return null; } return (

{text}

); })}
); } export function AdminInspectorMessageFeed({ messages, roomId, mediaUrls, deletingMessageId, onDelete, onOpenImage }: { messages: AdminChatMessage[]; roomId: string; mediaUrls: Record; deletingMessageId: string | null; onDelete: (messageId: string) => void; onOpenImage: (message: ChatMessage) => void; }) { const chatMessages = messages.map((message) => adminMessageToChatMessage(message, roomId)); const displayItems = groupChatMessagesForDisplay(chatMessages); const adminById = new Map(messages.map((message) => [message.id, message])); return (
{displayItems.map((item) => { if (item.kind === 'album') { const anchor = adminById.get(item.messages[0]!.id); if (!anchor) return null; return ( deletingMessageId === message.id)} onDelete={() => onDelete(anchor.id)} onOpenImage={onOpenImage} bodyOverride={ adminById.get(message.id)) .filter((entry): entry is AdminChatMessage => Boolean(entry))} roomId={roomId} mediaUrls={mediaUrls} onOpenImage={onOpenImage} /> } /> ); } const adminMessage = adminById.get(item.message.id); if (!adminMessage) return null; return ( onDelete(adminMessage.id)} onOpenImage={onOpenImage} /> ); })}
); } export function AdminInspectorMessageRow({ message, roomId, mediaUrls, deleting, onDelete, onOpenImage, bodyOverride }: { message: AdminChatMessage; roomId: string; mediaUrls: Record; deleting: boolean; onDelete: () => void; onOpenImage: (message: ChatMessage) => void; bodyOverride?: ReactNode; }) { return (
{message.senderName} {new Intl.DateTimeFormat('ru-RU', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(message.createdAt))} {message.isDeleted ? Удалено : null}
{bodyOverride ?? ( )}
{!message.isDeleted && !message.isEncrypted ? ( ) : null}
); }