Коммуникационный хаб «Сообщения» — прототип

Единая точка входа для всех чатов TRIDE вместо разбросанных пунктов меню (chat, echat, clientchat, support, clientchats, /asupport). Состав хаба зависит от роли, прав (clientchat:*) и настроек клуба (clubSettings.menu/employeemenu). Основано на реальных системах: tv_chat (общий канал клуба/сотрудников), clientchat (лички клиент↔клуб + виджет), support (клуб↔TRIDE), планируемые чаты тренер↔клиент и клиент↔клиент.
Платформа
Роль
Настройки клуба
Общий чат (menu.chat)
Чат с клубом (menu.clientchat)
Чат сотрудников (employeemenu.echat)
Чаты с тренерами (будущее)
Клиент↔клиент (будущее)
Экран

1. Точка входаодна кнопка «Сообщения» с суммарным бейджем непрочитанных

Концепция: один пункт меню «Сообщения» (id messages, иконка chat) заменяет все чат-пункты. Десктоп — в левом сайдбаре + быстрая иконка в TopBar рядом с колокольчиком. Мобилка — слот в BottomMenu (настраиваемый, как остальные слоты через брендирование bottommenu) + иконка в TopBar. Бейдж — сумма client_chats.unread_client/unread_club + support_chats.unread_club/unread_tride (+ будущие coach/p2p), отдаётся лёгким REST-счётчиком и обновляется сокет-событиями.

2. Экран хаба /messagesmaster-detail: список → переписка → контекстный сайдбар

Список чатов сгруппирован: Личные (клуб, тренер, поддержка, клиенты), Клубные каналы (общий чат, чат сотрудников). У каждого чата — тип (плашка), последнее сообщение, время, бейдж непрочитанных. Справа — переписка (общий SupportMessage/MessageComposer) и сайдбар по типу чата: клиент-инфо для сотрудника (ClientSidebar: профиль, занятия, абонементы, пакеты, сегменты, бейджи, FTP), клуб-инфо для админа (ClubInfoPanel: агенты, теги, устройства, сотрудники), у тренера — записи/цели/планы клиента. Кликните на чаты в списке, чтобы посмотреть варианты сайдбара.

3. Матрица «роль × чат × условие»что попадает в хаб и откуда данные

ЧатКлиентСотрудникТренерАдмин TRIDEИсточник (бэк)
Чат с клубом (личка 1:1 + виджет) если menu.clientchat perm clientchat:view (все чаты клуба) client_chats + client_chat_messages, сокет clientchat_*
Общий чат клуба (канал, Indoor TV) если menu.chat если menu.chat если menu.chat tv_chat_messages chat_type=client, room <club>
Чат сотрудников (канал) если employeemenu.echat если employeemenu.echat tv_chat_messages chat_type=employee, room <club>_employee
Поддержка TRIDE (клуб ↔ платформа) всегда (club_menu:false) опционально triderole 100/200, агенты support_chats + support_messages, сокет support_*
Чат с тренером (личка, по клубу) будущее настройка клуба если сам тренер свои клиенты по клубам новые коллекции по образцу clientchat, комната coachchat_<club>_chat_<id>
Клиент ↔ клиент (личка внутри клуба) будущее настройка клуба новые коллекции по образцу clientchat, RBAC клиентский
Личка 1:1 Клубный канал Поддержка Будущее

4. Заметки по реализации

Единый REST-счётчик: messages.badge{total, by_type} из unread-полей; кэш 30с + инвалидируется сокет-событиями. Пуши уже существуют (clientchat/support) и ведут в нужный чат хаба (/messages?chat=<id>).
Сайдбары: переиспользуем ClientSidebar.svelte (как в /clientchats) и ClubInfoPanel.svelte (как в /asupport) — оба уже адаптивны (десктоп-колонка / мобайл-оверлей).
Старые роуты (/venue/chat, /venue/echat, /venue/clientchat, /clientchats*, /asupport*) → редиректы в хаб с раскрытым чатом, пункты меню сворачиваются в один. Настройки включения чатов остаются как есть (ClubSettingsAppMenu/EmployeeMenu).
Известные подводные камни (учесть при реализации): REST-отправка не эмитит сокет-события (только polling-догрузка); tv_chat не имеет unread/read — для общего канала бейдж считаем по last_read_ts пользователя; копипаст сокет-логики на фронте — в хабе выносится в один composable.