diff --git a/src/components/messenger/messenger-attachments.tsx b/src/components/messenger/messenger-attachments.tsx index f5e8515..b841ef9 100644 --- a/src/components/messenger/messenger-attachments.tsx +++ b/src/components/messenger/messenger-attachments.tsx @@ -1,6 +1,6 @@ "use client" -import { useState } from 'react' +import { useState, useEffect } from 'react' import { useQuery } from '@apollo/client' import { GET_MESSAGES } from '@/graphql/queries' import { useAuth } from '@/hooks/useAuth' @@ -9,6 +9,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { Badge } from '@/components/ui/badge' import { ImageLightbox } from '@/components/ui/image-lightbox' +import { VoicePlayer } from '@/components/ui/voice-player' import { FileText, Image, @@ -16,7 +17,8 @@ import { Video, Download, Calendar, - User + User, + RefreshCw } from 'lucide-react' interface Organization { @@ -47,24 +49,33 @@ interface Message { interface MessengerAttachmentsProps { counterparty: Organization + onViewChange?: () => void } -export function MessengerAttachments({ counterparty }: MessengerAttachmentsProps) { +export function MessengerAttachments({ counterparty, onViewChange }: MessengerAttachmentsProps) { const { user } = useAuth() const [activeTab, setActiveTab] = useState('all') const [lightboxImage, setLightboxImage] = useState<{ url: string; fileName: string; fileSize?: number } | null>(null) // Загружаем все сообщения для получения вложений - const { data: messagesData, loading } = useQuery(GET_MESSAGES, { - variables: { counterpartyId: counterparty.id, limit: 1000 }, // Увеличиваем лимит для получения всех файлов - fetchPolicy: 'cache-first', + const { data: messagesData, loading, refetch } = useQuery(GET_MESSAGES, { + variables: { counterpartyId: counterparty.id, limit: 1000 }, + fetchPolicy: 'cache-and-network', + pollInterval: 5000, // Обновляем каждые 5 секунд + notifyOnNetworkStatusChange: false, // Не показываем loading при обновлениях }) + // Обновляем данные при открытии вкладки вложений + useEffect(() => { + onViewChange?.() + }, [onViewChange]) + const messages: Message[] = messagesData?.messages || [] // Фильтруем только сообщения с вложениями const attachmentMessages = messages.filter(msg => - msg.type && ['VOICE', 'IMAGE', 'FILE'].includes(msg.type) && msg.fileUrl + msg.type && ['VOICE', 'IMAGE', 'FILE'].includes(msg.type) && + (msg.fileUrl || (msg.type === 'VOICE' && msg.voiceUrl)) ) // Группируем по типам @@ -76,10 +87,6 @@ export function MessengerAttachments({ counterparty }: MessengerAttachmentsProps return org.name || org.fullName || 'Организация' } - const getManagerName = (org: Organization) => { - return org.users?.[0]?.managerName || 'Управляющий' - } - const getInitials = (org: Organization) => { const name = getOrganizationName(org) return name.charAt(0).toUpperCase() @@ -128,12 +135,12 @@ export function MessengerAttachments({ counterparty }: MessengerAttachmentsProps } const renderFileIcon = (fileType?: string) => { - if (!fileType) return + if (!fileType) return - if (fileType.startsWith('image/')) return - if (fileType.startsWith('audio/')) return - if (fileType.startsWith('video/')) return