From 8063ca64b8bbca3f2e49581622e9bf199ce659c2 Mon Sep 17 00:00:00 2001 From: Bivekich Date: Mon, 21 Jul 2025 15:11:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20MessengerAttachments:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B3=D0=BE=D0=BB=D0=BE=D1=81=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D1=85=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=81=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20VoicePlayer,=20=D1=83?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D1=80=D0=B8=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20=D0=B2=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=BA=D0=B8=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9.=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B8=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=20MessengerCha?= =?UTF-8?q?tWithAttachments=20=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=B7=D0=B0=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messenger/messenger-attachments.tsx | 377 +++++++------ .../messenger-chat-with-attachments.tsx | 518 ------------------ src/components/messenger/messenger-chat.tsx | 387 +++++++------ .../messenger/messenger-dashboard.tsx | 4 +- 4 files changed, 393 insertions(+), 893 deletions(-) delete mode 100644 src/components/messenger/messenger-chat-with-attachments.tsx 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