feat(ui): cross-screen caches + invitation delta channel + hint recenter on a zoomed board #56
Reference in New Issue
Block a user
Delete Branch "feature/lobby-cache-any-screen-invitation-delta"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Продолжение работы по межэкранной свежести кэшей (поверх #55). Теперь свежесть лобби/игры держится с любого активного экрана, а приглашения становятся живым дельта-каналом.
Клиент
advanceCachedтеперь сворачивает иopponent_joinedв кэш не-просматриваемой игры через новый чистый редьюсерapplyOpponentJoined(вынесен и переиспользован смонтированной доской). Открыть open-игру, в которую вошли, пока ты был на другом экране — без мерцания доски.patchLobbyInvitation— upsert ещё-pending приглашения, удаление терминального (started/declined/cancelled/expired). Глобальный notify-хендлер зовёт его на subinvitation/invitation_update.Дельта-канал приглашений (без изменений wire/gateway/connector)
Ключевое: уведомление уже несёт полный
Invitationсid/status/game_idсквозь все слои (создание приглашений так работает сегодня), а неизвестные notify-sub'ы Telegram-сервис не рендерит. Поэтому:NotifyInvitationUpdate+ конструкторNotificationInvitationUpdate(общий кодер сNotificationInvitation). Коннектор для него сообщение не рендерит → decline/cancel никогда не станут out-of-app пушем.Осознанные границы
incoming(друзья) в снапшоте точечно не патчится — у него свойnotify-путь и бейдж (refreshNotifications).Тесты
TDD (RED→GREEN): юниты
applyOpponentJoined,patchLobbyInvitation, кодированиеNotificationInvitationUpdate; интеграционные ассерты, что decline/cancel/accept публикуютinvitation_updateкаждому участнику. Полный локальный набор зелёный: backend unit + integration (./backend/...), UI check / unit 184 / build / bundle / e2e 114 (Chromium + WebKit). Документация: ARCHITECTURE §10 + UI_DESIGN.Дополнительно: фокус доски при подсказке в zoom-in (отдельный коммit)
Мелкая шероховатость: подсказка, взятая когда доска уже приближена, применялась, но доска не скроллилась на новое слово (эффект скролла отслеживал только переключение зума, а
focusчитался черезuntrack). Добавлен нонсrecenter, который подсказка бампает; при запросе без смены зума доска панится прямо кfocus. Выкладывание/перетаскивание фишек по-прежнему не дёргают доску. e2e RED→GREEN на обоих движках.Ещё два фикса в этой же ветке
$effectнаapp.lastEventчиталview/placement(черезcacheSnapshot) и сам же писалviewв ветках → запись становилась его зависимостью → самоинвалидирующийся бесконечный цикл, блокирующий поток (доска/rack «намертво»).opponent_movedспасала идемпотентность дельты, уopponent_joined/game_overеё нет. Фикс: обернуть тело эффекта вuntrack— эффект зависит только отapp.lastEventи обрабатывает событие один раз. Регрессионный e2e: после джойна выставление фишки рендерит pending (RED без фикса → GREEN).void recenterмог быть выкинут продакшен-минификатором (e2e гоняет только немінифицированный dev-сервер). Нонс читается в используемую переменную и пан гейтится на реальное изменение — зависимость устойчива к минификации и не панит на ресайзе.test(ui): e2e против минифицированной сборки
E2e гонялся против немінифицированного dev-сервера, поэтому продакшен-минификация была невидима (как раз так проскользнул бы выкинутый
void recenter). Теперь webServer собирает mock-сборку и отдаёт минифицированный артефакт черезvite preview— тот же бандл, что на контуре. Сборка вdist-e2e/(gitignored, не затираетdist/для bundle-size),--base /чтобы SPA-фолбэк грузил и подпуть/telegram/. Все 118 спеков зелёные против сборки на обоих движках, включая тест recenter — подтверждает, что укреплённая зависимость переживает минификацию.feat(lobby): caches fresh from any screen + invitation delta channelto feat(ui): cross-screen caches + invitation delta channel + hint recenter on a zoomed boardNew commits pushed, approval review dismissed automatically according to repository settings
New commits pushed, approval review dismissed automatically according to repository settings