Skip to content

Чаты

Обзор

Мультимессенджерная система чатов с 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

При входе на экран чата:

  1. wsClient.joinChat(chatId) — вход в комнату
  2. Подписка на события message:new, message:updated, message:deleted
  3. При выходе: 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 replyselectionAsync()
Удаление сообщенияnotificationWarning()
Long pressimpactMedium()