Одна система чатов. Все приложения экосистемы.
Всё для коммуникации — в одном пакете
- Чат в заказе — автоканалКаждый service_order автоматически создаёт коммуникационный канал. Никакой ручной настройки — создали заказ, чат уже работает. Клиент и исполнитель подключаются мгновенно.
- Голосовые звонки (Opus)WebRTC с кодеком Opus. Работает в браузере и мобильном приложении одинаково. Адаптация битрейта под качество сети — связь не рвётся.
- Видеозвонки HDHD-видео для юридических и психологических консультаций. Запись сессии, адаптивное качество, переключение камер. Идеально для QOR Consultant.
- Push-уведомленияFirebase Cloud Messaging для мобильных, Socket.IO для web-клиентов. Двойной канал доставки — пользователь не пропустит ни одного сообщения.
- История сообщенийПолная история чатов с поиском и фильтрацией. Сообщения шифруются E2E и хранятся на серверах в Казахстане. Метаданные индексируются для быстрого доступа.
- Групповые чатыОператор, клиент, исполнитель — в одном канале. Медиация, контроль качества, совместная работа. Любой сценарий с тремя и более участниками.
Чат в действии
Заказ #4521 — Трудовой спор
Алия и Дмитрий (юрист)
Алия
Добрый день! Мне нужна помощь по трудовому договору — работодатель отказывается платить сверхурочные уже три месяца.
Дмитрий (юрист)
Здравствуйте, Алия! Понял ситуацию. Уточните — трудовой договор заключён официально? Работаете по ТК РК?
Алия
Да, официально. Договор на руках, могу отправить фото прямо сюда. Там есть пункт про оплату переработок.
Как подключить
Добавьте модуль
Добавьте @qor/chats в nuxt.config.ts. Пакет зарегистрирует composables, компоненты и middleware автоматически.
Вызовите useQorChat()
Передайте orderId — composable вернёт messages, sendMessage и статус соединения. Канал создаётся под капотом.
Чат работает
Канал привязан к заказу. История подгружается автоматически. Голос и видео доступны через useQorRTC().
API — просто как composable
// Текстовый чат — одна строка инициализации
const {
messages, // Ref<ChatMessage[]> — реактивный список
sendMessage, // (text: string) => Promise<void>
sendFile, // (file: File) => Promise<void>
isConnected, // Ref<boolean> — статус соединения
unreadCount // Ref<number> — непрочитанные
} = useQorChat({ orderId: props.orderId })
// Голос и видео — отдельный composable
const {
startCall, // (type: 'audio' | 'video') => void
endCall, // () => void
isInCall, // Ref<boolean>
remoteStream, // Ref<MediaStream | null>
toggleMute, // () => void
toggleCamera // () => void
} = useQorRTC({ channelName: orderId })