fix(ui): keep lobby/game caches fresh across screens (no stale-status flash) #55
Reference in New Issue
Block a user
Delete Branch "feature/ui-cross-screen-cache-freshness"
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?
Что и зачем
Кэши экранов (
lobbycache,gamecache) обновлялись только тем экраном, который ими владеет, и только пока он смонтирован. Поэтому изменение состояния, пересекающее экраны, оставляло кэш другого экрана устаревшим — и он заметно перерисовывался при следующей навигации:Решение
Свежесть кэшей делается межэкранной, владелец — единый глобальный обработчик стрима, который выполняется на каждое live-событие независимо от смонтированного экрана:
patchLobbyGame(теперь upsert) вписываетGameViewзатронутой игры в снапшот лобби; глобальный обработчик зовёт его наopponent_moved/game_over/opponent_joinedи при сидированииmatch_found/game_started(чтобы игра, начатая на другом экране, тоже была в лобби). Экран игры по-прежнему сам зеркалит свой ход и собственныйload()— это два обновления, которых нет ни в одном событии.advanceCached(чистая обёртка над уже существующими редьюсерами дельты) накатываетopponent_moved/game_overна кэш не открытой сейчас игры; игра в просмотре пропускается, чтобы её смонтированная доска осталась единственным владельцем (без двойного применения).Поведение в конечном состоянии не меняется (фоновый refresh и раньше всё примирял) — убран переходный устаревший кадр. Контракты/wire/семантика событий не тронуты.
Граница (осознанно вне охвата)
incomingв снапшоте лобби с третьего экрана не патчатся точечно (у них свойnotify-путь + бейдж); следующий вход в лобби их cold-load'ит, как и раньше.your_turnбез сопровождающегоopponent_moved(старый пир / потерянный payload) лобби не патчит — fallback на cold-load.opponent_joinedотложен (редкий путь, cold-load на открытии покрывает) — кандидат на будущую «более глубокую» задачу.Тесты
TDD (RED → GREEN): новые юниты
patchLobbyGame(5) иadvanceCached(7). Полный набор как в CI:check0 ошибок ·test:unit176 ·buildok ·bundle-sizeв бюджете · e2e 114 (Chromium + WebKit).