Stage 8: UI social/account/history surfaces
Wire the deferred Stage 7 surfaces end-to-end (UI -> gateway transcode -> backend REST -> existing domain services): friends (incl. one-time friend codes), per-user blocks, friend-game invitations, profile editing + email binding, the statistics screen, and the in-game history + GCG export. Friends gain two add paths (interview decision, a deliberate plan change): one-time 6-digit codes (friend_codes table, 12h TTL, single-use, rate-limited redeem); and play-gated requests (shared game required) where an explicit decline is permanent, an ignored request lapses after 30 days, and a code bypasses a decline. Migration 00006 widens friendships_status_chk and adds friend_codes. Lobby notification badge is poll + push: a new generic `notify` event drives it live; the client polls on open/focus. Language stays a single Settings control that writes through to the durable account's preferred_language. GCG export is finished-only (game.ErrGameActive) and shares/downloads the .gcg file. Tests: backend unit + inttest (friend gate/decline/code, ListInvitations, GetStats, GCG gate), gateway transcode round-trips + notify constructor, UI vitest (codecs, win-rate, share choice) + Playwright social specs. Docs: PLAN (Stage 8 done + refinements + TODO-5), ARCHITECTURE, FUNCTIONAL(+ru), UI_DESIGN, TESTING, module READMEs.
This commit is contained in:
+27
-1
@@ -22,7 +22,11 @@ Login uses `Screen`.
|
||||
- **Back**: a thin, compact `<` drawn from two rotated CSS borders (`Header.svelte`
|
||||
`.chev`) — lighter than a glyph.
|
||||
- **Hamburger**: a CSS three-bar (`Menu.svelte`), deliberately larger; opens a dropdown
|
||||
of items (lobby: Profile/Settings/About; game: History/Chat/Check word/Drop game).
|
||||
of items (lobby: Friends/Profile/Settings/About; game: History/Chat/Check word, plus
|
||||
*Export GCG* on a finished game and *Add to friends* per opponent, then Drop game). A
|
||||
red count **badge** rides the hamburger (and the lobby *Friends* item) for pending
|
||||
incoming friend requests + invitations; the same dot style serves any future
|
||||
notification count.
|
||||
- **Tab bar** (`TabBar.svelte`): square, borderless, evenly distributed buttons — a large
|
||||
emoji icon over a tiny truncated label. A press highlights a rounded **square** behind
|
||||
the icon (slightly larger than it) until release; spacing keeps adjacent labels from
|
||||
@@ -77,6 +81,28 @@ Lobby rows show two lines (opponents, then result + score) with a large place-ba
|
||||
on the right: Victory 🏆 / Defeat 🥈 / Draw 🏅, and for 3–4-player games II 🥈 / III 🥉 /
|
||||
IV 🏅; active games show Your move 🟢 / Opponent's move ⏳; invitations use 💌.
|
||||
|
||||
## Social, account & history surfaces (Stage 8)
|
||||
|
||||
- **Friends** (`screens/Friends.svelte`, from the lobby menu): an "add a friend" block
|
||||
pairing a code **input** with a **Show my code** action that reveals a large 6-digit
|
||||
code + its expiry; then the incoming **requests** (Accept / Decline), the **friends**
|
||||
list (Remove / Block), and a **blocked** list (Unblock). Durable accounts only — a
|
||||
guest sees a sign-in prompt.
|
||||
- **Invitations**: a lobby **section** (a 💌 row per open invitation) with Accept /
|
||||
Decline for an invitee and a waiting/Cancel state for the inviter; creating one is the
|
||||
**"Play with friends"** mode in `NewGame.svelte` (pick invitees, then variant / move
|
||||
time / hints).
|
||||
- **Statistics** (`screens/Stats.svelte`, the lobby 📊 tab): a 2-column grid of stat
|
||||
cards (wins / losses / draws / games / win-rate / best game / best move) — pure
|
||||
numbers, no charts.
|
||||
- **Profile editing** (`screens/Profile.svelte`): an inline form (display name, timezone,
|
||||
the away-window time pickers, block toggles) and an email-binding sub-flow (enter email
|
||||
→ enter the confirm code). Interface language stays in **Settings** (it writes through
|
||||
to the account for durable users).
|
||||
- **History / GCG**: the in-game slide-down history gains the running total per move;
|
||||
*Export GCG* shares or downloads the `.gcg` file and appears only once the game is
|
||||
finished.
|
||||
|
||||
## Caveat
|
||||
|
||||
Emoji are rendered by the platform's system emoji font, so their exact look varies across
|
||||
|
||||
Reference in New Issue
Block a user