Stack Client

TU Discussions

(UI-екран Family-меню)

TU Discussions — спільний per-Family розділ обговорень щодо TU. Розділ доступний у udate, prime (маршрут talkytimes), golden і chathouse та зберігає окремий контекст повідомлень і непрочитаного для кожної Family.

Use cases

Socket TU Discussions створюється лише під час перебування користувача на сторінці розділу та відключається після виходу з неї. Поза сторінкою лічильники непрочитаного не підтримують постійне socket-з’єднання: актуальні значення завантажуються через REST щоразу при відкритті Family-меню.

  • Користувач бачить лічильник непрочитаних повідомлень у Family-меню, навіть коли сторінка TU Discussions не відкрита.
  • Після відкриття розділу користувач бачить усі доступні TU, може знайти потрібну TU за ім’ям або TU ID та переглянути її дискусію. Кількість непрочитаних повідомлень показується badge на відповідній TU.
  • Користувач може відповісти на повідомлення, додати файли, а також редагувати чи видалити власне повідомлення, якщо це дозволяють отримані canEdit і canDelete.
  • Нове socket-повідомлення позначається переглянутим тільки після фактичної видимості у viewport активної вкладки браузера.

Доступи та маршрути

РольДоступМаршрут
topManagerпризначені Family/top_manager/{family-route}/tu_discussions
supervisorпризначені Family/teamlead/{family-route}/tu_discussions
operatorвласна Family/operator/tu_discussions
client_managerпризначені Family/client_manager/{family-route}/tu_discussions

director, hr_manager, recruiter і technical_department не мають доступу. {family-route} дорівнює udate, talkytimes, golden або chathouse; talkytimes відповідає Family prime.

Фільтри списку TU

Список доступних TU завантажується через POST /v2/tus/preview. Роль визначає доступні командні фільтри:

  • topManager може фільтрувати TU за team lead та operator;
  • supervisor — за operator;
  • client_manager — за team lead;
  • operator не бачить командних фільтрів.

Вибрані значення передаються у preview-запит як teamLeadProjectId і operatorProjectId. Зміна team lead скидає вибраного operator. Список team lead та operator завантажується при відкритті відповідного dropdown через чинні endpoints team members.

Непрочитані повідомлення й надалі завантажуються через getUnviewedByTu та накладаються на preview-список за канонічним TU ID. Зміна фільтрів не змінює socket-контракт і логіку лічильників непрочитаного.

Теги

Повний набір тегів:

  • #media
  • #real_gifts
  • #profile
  • #sender
  • #icebreakers
  • #ru

Для client_manager бекенд має повертати тільки #media, #real_gifts і #profile. Селектор повністю будується з рольової відповіді API без дублювання рольових allowlist-обмежень на frontend, тому нові теги не потребують випуску нової версії frontend.

Тег отриманого повідомлення читається толерантно як непорожній рядок. Невідомий історичний тег не зриває завантаження всієї історії, але не з’являється у селекторі, якщо його немає у відповіді getTagsByRole.

Повідомлення та стани

  • Перша сторінка історії завантажується після вибору TU; старіші повідомлення додаються cursor-пагінацією без дублікатів.
  • Завантаження історії автоматично позначає отриману сторінку переглянутою на бекенді. Окремий запит перегляду використовується для нових socket-повідомлень, які стали видимими поза цим flow.
  • Події створення, оновлення, soft-delete і перегляду застосовуються тільки до відкритої дискусії.
  • Подія перегляду може додати до одного повідомлення кілька реакцій; непрочитане прибирається тільки за реакцією поточного користувача.
  • Після socket reconnect frontend повторно приєднується до потрібних кімнат і синхронізує непрочитані дані через REST. Для відкритої TU також повторно завантажується актуальна історія.
  • HTTP snapshot узгоджується з socket-подіями, що надійшли під час запиту, тому пізня відповідь не повертає вже прочитане повідомлення і не губить щойно отримане непрочитане.

Порожні, loading та error-стани

  • До вибору TU панель повідомлень показує підказку вибрати TU.
  • Порожній список повідомлень і порожній список TU мають окремі empty states.
  • Під час завантаження списку чи історії показується локальний loader.
  • Помилки REST і socket join показуються через глобальне повідомлення без скидання вже завантажених даних.

Зв’язки

  • TU Chat у test Swagger — актуальні REST-контракти getMessages, createMessage, updateMessage, deleteMessage, viewMessages, getTagsByRole, getUnviewedMessageIds і getUnviewedByTu.
  • TU preview у test Swagger — список доступних TU з фільтрами teamLeadProjectId і operatorProjectId.
  • swagger — реєстр Swagger UI бек-сервісів.