Улучшить звуки входящих личных сообщений

This commit is contained in:
AidarKC
2026-06-25 12:55:42 +04:00
parent 8768e142e3
commit 112ab4d5d5
4 changed files with 149 additions and 5 deletions
@@ -0,0 +1,31 @@
## Краткое описание
Доработаны входящие уведомления для личных сообщений в сценарии, когда UI открыт, но страница скрыта на телефоне:
- для входящего DM при `document.visibilityState !== visible` UI пытается показать системное уведомление через `service worker`;
- добавлен `best effort` сигнал через `navigator.vibrate()`;
- добавлен короткий локальный звуковой сигнал через Web Audio, если аудио-контекст был ранее разблокирован пользовательским действием.
- для видимой активной страницы этот же сигнал теперь проигрывается на каждое новое входящее DM;
- для скрытой страницы звуковой сигнал сделан длиннее и заметнее.
## Что проверять
- открыть SHiNE в Chrome/Android и один раз взаимодействовать со страницей;
- свернуть браузер или увести вкладку в фон, не закрывая её полностью;
- отправить DM с другого аккаунта;
- при открытой видимой странице тоже отправить DM и убедиться, что короткий сигнал воспроизводится без системного уведомления в шторке;
- проверить, что:
- сообщение пришло в шторку как системное уведомление;
- при поддержке устройства есть вибрация;
- на части устройств/браузеров может прозвучать локальный сигнал;
- отдельно проверить, что при открытой видимой странице не появилось лишних дублей системного уведомления.
## Ожидаемый результат
- скрытая, но живая страница стала заметнее реагировать на входящий DM;
- уведомление в фоне не зависит только от `new Notification(...)` из страницы;
- если браузер разрешает локальный аудио-сигнал, пользователь слышит короткое оповещение.
## Статус
`pending`
+11
View File
@@ -184,6 +184,15 @@ Read-receipt пока остаются в legacy-формате:
- `AckSessionDelivery`
WebPush и локальные уведомления сейчас работают так:
- для активной онлайн-сессии приоритет у доставки по WebSocket через `SignedMessageArrived`;
- если целевая сессия не онлайн по WebSocket, сервер может отправить WebPush с `kind=new_message`;
- если вкладка/приложение живы, но страница скрыта (`document.visibilityState !== visible`), UI дополнительно пытается показать системное уведомление через `service worker`;
- для активной видимой страницы UI проигрывает короткий локальный сигнал на каждое новое входящее DM, если браузер ранее разрешил аудио-контекст после пользовательского жеста;
- для скрытой, но живой страницы UI также делает `best effort` сигнал через `vibrate()` и более длинный локальный звук;
- эти локальные сигналы не гарантируются браузером: на мобильных устройствах они зависят от политики Chrome/Android/iOS.
## Правила UI
UI сейчас работает так:
@@ -194,6 +203,8 @@ UI сейчас работает так:
- позволяет владельцу сообщения вызвать меню `Скопировать как текст / Прочесть / Изменить / Удалить`;
- при редактировании показывает над полем ввода полоску `Редактируем сообщение: ...` с кнопкой отмены;
- после редактирования показывает под временем отдельную строку `изменено: <дата время>`;
- на видимом экране чата/приложения проигрывает короткий локальный звук на новое входящее DM;
- при входящем DM для скрытой, но ещё живой страницы пытается поднять системное уведомление через `service worker`;
- не показывает и не принимает вложения.
## Что обязательно помнить