feat(nudge): name the sender; blink lobby cards; re-animate toasts #75

Merged
developer merged 2 commits from feature/nudge-name-lobby-blink into development 2026-06-16 19:33:57 +00:00
Owner

Что

«Жду вашего хода» оказалась nudge-всплывашкой (chat.nudge), без имени отправителя. Теперь:

  1. Имя в nudge. Резолвим имя отправителя по снимку имени сидения на сервере и кладём в новое поле NudgeEvent.sender_name:
    • всплывашка в приложении: «<Соперник>: Жду Вашего хода 🤭» (chat.nudgeBy);
    • Telegram-пуш тоже называет отправителя (render nudgeBy);
    • фолбэк на голую фразу, если имени нет (RU/EN зеркально). your_turn уже был с именем — не трогали.
  2. Моргание карточки лобби. Когда карточка переходит в «твой ход» или «завершена» (пока лобби открыто), её эмодзи-статус дважды моргает (2×1 c). Переход на ход соперника — на месте, без моргания. Состояние по gameId (SvelteSet + nonce + таймер на игру) — карточки изолированы; под reduce-motion выключено.
  3. Самая свежая всплывашка отменяет предыдущую и заново проигрывает появление (seq + {#key} в Toast.svelte), единообразно везде.

Scope: backend (notify/social/game) + FB-схема (NudgeEvent.sender_name, реген Go+TS) + Telegram-рендер + UI. Без миграций БД → контур без вайпа.

Проверка локально (всё зелёное)

gofmt/go build/go vet · backend-unit + telegram · полная интеграция (вкл. новый TestSeatNameResolvesDisplayName) · UI check/test:unit (271)/build/bundle-gate · e2e 138 (Chromium+WebKit).

Живая проверка на контуре (после деплоя)

  • От соперника нажать 🛎️ → всплывашка «<Соперник>: Жду Вашего хода 🤭» в лобби и на других экранах; пузырёк в чате — новая формулировка.
  • Telegram-пуш nudge называет отправителя.
  • Соперник ходит → карточка в лобби дважды моргает; партия завершается → моргает медаль; ход соперника → без моргания.
  • Несколько всплывашек подряд — каждая отменяет предыдущую и заново появляется.

Отложено: PLAN.md TODO-7 — FLIP-анимация переезда карточки между секциями (косметика).

## Что «Жду вашего хода» оказалась **nudge**-всплывашкой (`chat.nudge`), без имени отправителя. Теперь: 1. **Имя в nudge.** Резолвим имя отправителя по снимку имени сидения на сервере и кладём в новое поле `NudgeEvent.sender_name`: - всплывашка в приложении: `«<Соперник>: Жду Вашего хода 🤭»` (`chat.nudgeBy`); - Telegram-пуш тоже называет отправителя (`render` `nudgeBy`); - фолбэк на голую фразу, если имени нет (RU/EN зеркально). `your_turn` уже был с именем — не трогали. 2. **Моргание карточки лобби.** Когда карточка переходит в «твой ход» или «завершена» (пока лобби открыто), её эмодзи-статус дважды моргает (2×1 c). Переход на ход соперника — на месте, без моргания. Состояние по `gameId` (SvelteSet + nonce + таймер на игру) — карточки изолированы; под reduce-motion выключено. 3. **Самая свежая всплывашка** отменяет предыдущую и заново проигрывает появление (`seq` + `{#key}` в `Toast.svelte`), единообразно везде. Scope: backend (`notify`/`social`/`game`) + FB-схема (`NudgeEvent.sender_name`, реген Go+TS) + Telegram-рендер + UI. Без миграций БД → контур **без вайпа**. ## Проверка локально (всё зелёное) `gofmt`/`go build`/`go vet` · backend-unit + telegram · полная интеграция (вкл. новый `TestSeatNameResolvesDisplayName`) · UI `check`/`test:unit` (271)/`build`/bundle-gate · e2e 138 (Chromium+WebKit). ## Живая проверка на контуре (после деплоя) - [ ] От соперника нажать 🛎️ → всплывашка `«<Соперник>: Жду Вашего хода 🤭»` в лобби и на других экранах; пузырёк в чате — новая формулировка. - [ ] Telegram-пуш nudge называет отправителя. - [ ] Соперник ходит → карточка в лобби дважды моргает; партия завершается → моргает медаль; ход соперника → без моргания. - [ ] Несколько всплывашек подряд — каждая отменяет предыдущую и заново появляется. Отложено: `PLAN.md` TODO-7 — FLIP-анимация переезда карточки между секциями (косметика).
developer added 1 commit 2026-06-16 17:09:59 +00:00
feat(nudge): name the sender; blink lobby cards; re-animate toasts
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 16s
CI / ui (pull_request) Successful in 49s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m21s
12d128f1cc
The "waiting for your move" popup was the nudge (chat.nudge), shown without a
sender name. Resolve the nudger's per-game seat name server-side and carry it on
a new NudgeEvent.sender_name field, so:

- the in-app toast reads "<opponent>: Waiting for your move 🤭" (chat.nudgeBy);
- the out-of-app Telegram push names the sender too (render nudgeBy);

falling back to the plain phrase when the name is absent (RU mirrored). The
your_turn toast already named the opponent and is unchanged.

Lobby: when a card transitions into "your turn" or "finished" while the lobby is
open, its status emoji blinks twice (two 1s fades); the opponent's-turn change
stays in place. Blink state is keyed by game id (SvelteSet + per-id nonce/timer)
so overlapping events animate in isolation; suppressed under reduce-motion.

Toast: a per-message seq re-keys Toast.svelte, so the freshest toast cancels the
previous one and replays its entrance, uniformly on every screen.

Tests: notify.Nudge round-trip + render named/fallback (Go), game.Service.SeatName
(integration), codec/i18n/gamePhase/shouldBlink (UI). Docs (FUNCTIONAL +_ru,
UI_DESIGN) + PLAN TODO-7 (deferred FLIP card-relocation animation) updated.
developer added 1 commit 2026-06-16 19:06:32 +00:00
fix(ui): don't refetch the lobby on heartbeats
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 50s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 58s
2a034ff9be
The lobby refetched /user/games on every stream event, including the 10s
keep-alive heartbeat, turning it into a 10s poll. That poll's REST view of a
just-committed opponent move could flip a card (and now blink it) seconds before
the matching your_turn event — and its toast — arrived over the slower live
stream, so the new lobby-card blink appeared to lead the toast by 5-7s (variable
with stream delivery; in sync when prompt).

Gate the refetch to real events (kind !== 'heartbeat'): the card, its blink and
the toast now ride the same event (opponent_moved + your_turn are published
together), and the constant 10s full-lobby poll per client is gone.
owner approved these changes 2026-06-16 19:33:06 +00:00
developer merged commit 05d83ced86 into development 2026-06-16 19:33:57 +00:00
developer deleted branch feature/nudge-name-lobby-blink 2026-06-16 19:33:57 +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#75