import React, { useState } from 'react'; import { INITIAL_CONVERSATIONS, ConversationItem } from '../../mock/mockData'; import { mockApi } from '../../mock/mockApi'; import { Badge, Button, MaturityBadge, useToast } from '../../shared/ui'; import { Send, Search, CheckCheck, Sparkles, Info, } from 'lucide-react'; export const CommunicationsModule: React.FC = () => { const { showToast } = useToast(); const [conversations, setConversations] = useState(INITIAL_CONVERSATIONS); const [activeConvId, setActiveConvId] = useState(INITIAL_CONVERSATIONS[0].id); const [replyText, setReplyText] = useState(''); const [channelFilter, setChannelFilter] = useState('all'); const [isTyping, setIsTyping] = useState(false); const [showCrmDrawer, setShowCrmDrawer] = useState(true); const activeConv = conversations.find((c) => c.id === activeConvId) || conversations[0]; const handleSend = async (e: React.FormEvent) => { e.preventDefault(); if (!replyText.trim()) return; const userText = replyText; setReplyText(''); // Immediately post agent message await mockApi.sendMessage(activeConvId, userText); const updated = await mockApi.getMessages(); setConversations(updated); // Trigger simulated customer auto-reply setIsTyping(true); setTimeout(async () => { setIsTyping(false); const simulatedReplies = [ 'Спасибо за быстрый ответ! Будем ждать вас.', 'Отлично, подтверждаю заказ. Оплату проведу при получении.', 'Спасибо большое! Подскажите ещё, есть ли у вас десерты без сахара?', 'Супер, всё понятно, спасибо вашей поддержке!', ]; const autoText = simulatedReplies[Math.floor(Math.random() * simulatedReplies.length)]; const currentConv = conversations.find(c => c.id === activeConvId); if (currentConv) { const replyMsg = { id: `m-reply-${Date.now()}`, sender: 'client' as const, senderName: currentConv.clientName, text: autoText, time: new Date().toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }), }; setConversations(prev => prev.map(c => { if (c.id === activeConvId) { return { ...c, lastMessage: autoText, time: 'Только что', messages: [...c.messages, replyMsg], }; } return c; })); showToast({ title: `Новый ответ от ${currentConv.clientName}`, message: autoText, type: 'info', }); } }, 750); }; const getChannelBadge = (channel: ConversationItem['channel']) => { switch (channel) { case 'telegram': return Telegram Bot; case 'whatsapp': return WhatsApp; case 'max': return MAX; case 'internal': return Командный чат; default: return Чат; } }; const filteredConversations = conversations.filter((c) => { if (channelFilter === 'all') return true; return c.channel === channelFilter; }); return (
{/* Top Header with MaturityBadge */}

Единый центр коммуникаций & Омниканальный Inbox

Telegram, WhatsApp, MAX Messenger, Web-чат и внутренние командные каналы в одном окне

Онлайн: 4 канала активны
{/* Left: Conversations List */}
Диалоги ({filteredConversations.length})
{/* Channels Filter */}
{[ { id: 'all', label: 'Все' }, { id: 'telegram', label: 'Telegram' }, { id: 'whatsapp', label: 'WhatsApp' }, { id: 'max', label: 'MAX' }, { id: 'internal', label: 'Команда' }, ].map((ch) => ( ))}
{filteredConversations.map((conv) => (
setActiveConvId(conv.id)} className={`p-3 cursor-pointer transition-colors ${ conv.id === activeConvId ? 'bg-krona-surface font-medium border-l-2 border-krona-gold' : 'hover:bg-krona-surface/60 text-krona-secondary' }`} >
{conv.clientName} {conv.time}

{conv.lastMessage}

{getChannelBadge(conv.channel)} {conv.unreadCount > 0 && ( {conv.unreadCount} )}
))}
{/* Center: Active Conversation Thread */}
{/* Chat header */}
{activeConv.avatar}

{activeConv.clientName}

Канал связи: {activeConv.channel}
{getChannelBadge(activeConv.channel)}
{/* Message bubbles */}
{activeConv.messages.map((msg) => (
{msg.senderName}

{msg.text}

{msg.time} {msg.sender === 'agent' && }
))} {isTyping && (
Собеседник печатает...
)}
{/* Reply form */}
setReplyText(e.target.value)} placeholder="Напишите ответ клиенту или коллегам (симуляция авто-ответа)..." className="flex-1 bg-krona-surface border border-krona-border rounded-lg px-3 py-2 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green" />
{/* Right CRM Context Drawer */} {showCrmDrawer && (
CRM Контекст VIP Клиент
ФИО клиента:
{activeConv.clientName}
Телефон:
+7 (913) 482-19-02
LTV (Общий объем заказов):
48 200 ₽ (14 чеков)
Любимые позиции:
Филадельфия Премиум, Том Ям
AI Подсказка оператору:

Гость часто заказывает по пятницам в 19:30. Предложите сет Осенний со скидкой постоянного клиента.

)}
); };