Чаты
Обзор
Мультимессенджерная система чатов с real-time обновлениями через WebSocket. Поддерживаемые мессенджеры: Telegram, Instagram, WhatsApp, Viber, Messenger.
Архитектура
src/features/chat/
├── websocket/
│ └── WebSocketClient.ts # socket.io синглтон
├── stores/
│ └── chatStore.ts # Zustand store сообщений
├── haptics/ # Haptic feedback для чатов
└── ui/ # UI-компоненты чатовЭкраны
Список чатов ((tabs)/chats.tsx)
- Фильтрация по мессенджеру и статусу AI
- Badge с цветом мессенджера (Telegram: #0088CC, Instagram: #E4405F, WhatsApp: #25D366)
- Превью последнего сообщения
- Индикатор непрочитанных
Экран чата (chat/[id].tsx)
- Список сообщений с пагинацией (загрузка старых при скролле вверх)
- Индикатор набора текста
- Swipe to reply
- Ввод текста с soft keyboard handling
- Переключатель AI-контроля
Информация о чате (chat/info.tsx)
- Детали собеседника
- Информация о мессенджере
- Привязанный ассистент
WebSocket real-time
При входе на экран чата:
wsClient.joinChat(chatId)— вход в комнату- Подписка на события
message:new,message:updated,message:deleted - При выходе:
wsClient.leaveChat(chatId)
Обработка событий
| Событие | Действие |
|---|---|
message:new | Добавить в store + haptic feedback (light) |
message:updated | Обновить в store |
message:deleted | Удалить из store |
typing:start | Показать индикатор набора |
typing:stop | Скрыть индикатор набора |
Zustand store (useChatStore)
Структура
typescript
{
messagesByChat: Record<string, Message[]>, // Макс. 500 на чат
typingUsers: Record<string, string[]>,
replyingTo: Message | null,
sendingMessage: boolean,
}Selector hooks
useChatMessages(chatId)— массив сообщений чатаuseTypingUsers(chatId)— список печатающих пользователейuseReplyingTo()— сообщение, на которое отвечаем
Отправка сообщений
Пользователь нажимает «Отправить»
→ setSendingMessage(true)
→ saasApi.createMessage(payload)
→ setSendingMessage(false)
→ Haptic feedback (light impact)
→ WebSocket получает message:new → store обновляетсяAI-контроль
Каждый чат имеет флаг isUnderAiControl:
- Включен: AI-ассистент отвечает на сообщения автоматически
- Выключен: оператор отвечает вручную
Переключение: saasApi.toggleAiControl(chatId, enabled).
Haptic feedback
| Действие | Паттерн |
|---|---|
| Отправка сообщения | impactLight() |
| Получение сообщения | impactLight() |
| Swipe to reply | selectionAsync() |
| Удаление сообщения | notificationWarning() |
| Long press | impactMedium() |