feat(ui): explicit offline state inside an online game (+ offline word check) #260

Merged
developer merged 4 commits from feature/offline-ingame-ux into development 2026-07-14 07:51:08 +00:00
Owner

PR #2 из двух (после #259). Офлайн-UX внутри онлайн-игры.

Что раньше

При потере связи внутри онлайн-игры экран почти ничего не говорил: кнопки молча гасли (netReady), проваленный ход глотался без тоста, чат/словарь ломались тихо.

Что теперь

  • Баннер «связь потеряна» сверху доски + заморозка: весь rack, ходовые кнопки, social-кнопки (🤝/✖️) и вход 💬 (чат+словарь) отключаются; начатый ход остаётся черновиком, отправляешь сам после реконнекта.
  • Ведём от netState.offline (а не offlineMode.active) → покрывает и TG/VK, где раньше обрыв в игре был нем. (Синергия с #259: watchdog как раз даёт этот сигнал в простое.)
  • Уже внутри до обрыва: чат → серые send+nudge (как и было); словарь → точный локальный DAWG-фолбэк по закреплённой версии игры (ui/src/lib/dict/check.ts) — тот же вердикт, что на сервере, если dawg закэширован; иначе «недоступно офлайн». Жалоба и внешняя ссылка (нужна сеть) скрыты.

Файлы

Game.svelte (баннер + гейты), Rack.svelte (проп frozen), CheckScreen.svelte + новый dict/check.ts (+тест), i18n (en/ru), ingame-ux.spec.ts (e2e), docs (FUNCTIONAL+ru, ARCHITECTURE). Чат-компоненты не трогались.

Проверка

  • Unit: 5 тестов на localWordCheck + весь пакет 634 зелёных; svelte-check 0/0; build.
  • E2e: полный прогон 250 passed (chromium+webkit), включая новый тест «online game offline: banner + freeze + thaw» и существующие check-word/comms.
  • Онлайн-поведение не меняется (netReady=true → всё как было).

Оговорки

  • Замораживаем rack (вход в составление); локальные жесты доски (перетащить уже выставленную фишку) остаются — без сети, безвредны, отправка всё равно под disabled.
  • DAWG-фолбэк инертен, если словарь нужной версии не закэширован офлайн (осознанно).
  • Вид/тексты баннера — на твоё визуальное ревью на контуре (стиль по токенам, без color-mix ради старого WebView).
PR #2 из двух (после #259). Офлайн-UX внутри онлайн-игры. ## Что раньше При потере связи внутри онлайн-игры экран почти ничего не говорил: кнопки молча гасли (`netReady`), проваленный ход глотался без тоста, чат/словарь ломались тихо. ## Что теперь - **Баннер «связь потеряна»** сверху доски + **заморозка**: весь rack, ходовые кнопки, social-кнопки (🤝/✖️) и вход 💬 (чат+словарь) отключаются; начатый ход остаётся черновиком, отправляешь сам после реконнекта. - Ведём от **`netState.offline`** (а не `offlineMode.active`) → **покрывает и TG/VK**, где раньше обрыв в игре был нем. (Синергия с #259: watchdog как раз даёт этот сигнал в простое.) - **Уже внутри до обрыва:** чат → серые send+nudge (как и было); **словарь → точный локальный DAWG-фолбэк** по закреплённой версии игры (`ui/src/lib/dict/check.ts`) — тот же вердикт, что на сервере, если dawg закэширован; иначе «недоступно офлайн». Жалоба и внешняя ссылка (нужна сеть) скрыты. ## Файлы `Game.svelte` (баннер + гейты), `Rack.svelte` (проп `frozen`), `CheckScreen.svelte` + новый `dict/check.ts` (+тест), i18n (en/ru), `ingame-ux.spec.ts` (e2e), docs (FUNCTIONAL+ru, ARCHITECTURE). Чат-компоненты не трогались. ## Проверка - Unit: 5 тестов на `localWordCheck` + весь пакет 634 зелёных; svelte-check 0/0; build. - E2e: полный прогон **250 passed** (chromium+webkit), включая новый тест «online game offline: banner + freeze + thaw» и существующие check-word/comms. - Онлайн-поведение не меняется (netReady=true → всё как было). ## Оговорки - Замораживаем rack (вход в составление); локальные жесты доски (перетащить уже выставленную фишку) остаются — без сети, безвредны, отправка всё равно под disabled. - DAWG-фолбэк инертен, если словарь нужной версии не закэширован офлайн (осознанно). - Вид/тексты баннера — на твоё визуальное ревью на контуре (стиль по токенам, без color-mix ради старого WebView).
developer added 1 commit 2026-07-14 06:53:48 +00:00
feat(ui): explicit offline state inside an online game (+ offline word check)
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Failing after 12s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Failing after 1s
CI / deploy (pull_request) Has been skipped
28afcff551
When an online game loses the connection the game screen now says so and freezes
instead of silently greying out: a "connection lost" banner appears and the rack,
the move controls, the add-friend/block controls and the chat/dictionary entry all
disable (a started move stays a draft, committed by the player on reconnect). It is
driven off the net-state machine (netState.offline), so it also covers the
Telegram/VK mini-apps, where a lost connection was previously mute in-game.

If the player is already in the dictionary when the drop happens, the word check
falls back to the game's pinned on-device dictionary (exact when that dawg is
cached; "unavailable offline" otherwise) and the network-only complaint + external
look-up hide. Chat, when already open, keeps its existing read-only degrade
(send/nudge disable). New pure helper localWordCheck is unit-tested; the in-game
gating gets an e2e.
developer added 1 commit 2026-07-14 06:59:42 +00:00
fix(ui): lazy-load the offline word-check helper to keep it out of the entry bundle
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 1m14s
CI / conformance (pull_request) Successful in 11s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 2m42s
c522e77599
CheckScreen's static import of dict/check pulled the dawg loader/reader into the app
entry bundle, pushing it 0.8 KB over the 130 KB budget (CI bundle-size gate). The
dict subsystem is lazy everywhere else, so import localWordCheck dynamically in the
offline branch — it loads only when an offline check actually runs. Main entry back
to 129.0 KB.
developer added 1 commit 2026-07-14 07:06:09 +00:00
chore: fix broken telegram links
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 21s
CI / ui (pull_request) Successful in 1m14s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 2m7s
564abdcf88
developer added 1 commit 2026-07-14 07:38:51 +00:00
fix(ui): offline in-game — usable dictionary check + hide (not disable) resign/chat
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 20s
CI / ui (pull_request) Successful in 1m15s
CI / conformance (pull_request) Successful in 12s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 2m5s
471fadc6a4
Two fixes from contour testing of the offline-in-game UX:

- The dictionary word check was unusable offline (Check button disabled) when the
  panel was reached while already offline: CheckScreen fetched the variant + pinned
  version over the network in onMount, which fails offline, leaving the default
  variant so input sanitising stripped every letter. Seed both from the cached game
  (present once the board has opened) so the input and the on-device dawg fallback
  work without a round-trip; the network refresh still runs when online and on a
  cold deep-link.
- The resign and chat controls were only functionally disabled (chat) or not gated
  at all (resign) offline, so they still looked active. Hide both while offline,
  matching the frozen social controls.

Tests: the in-game offline e2e now asserts the drawer action icons are hidden (not
disabled); a new e2e guards the offline dictionary flow. Docs updated.
owner approved these changes 2026-07-14 07:49:38 +00:00
developer merged commit ed79c30d2a into development 2026-07-14 07:51:08 +00:00
developer deleted branch feature/offline-ingame-ux 2026-07-14 07:51:08 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/scrabble-game#260