Stage 17 #2: Connecting indicator + auto-retry, instead of red toasts
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 36s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 55s
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 36s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 55s
Connectivity failures become state, not a toast on every attempt. A global online signal (lib/connection.svelte.ts) flips on a transport unavailable / rate_limited and on the live stream's drop, driving a pure-CSS header spinner + 'Connecting…' in place of the title and softly disabling the in-game server actions (commit / exchange / pass / hint; local board/rack/reset stay live). - transport: exec auto-retries with capped exponential backoff — every op on a rate-limit (rejected before processing, safe), reads only on unavailable (a mutation is never blindly re-sent, to avoid double-applying one whose response was lost; its button is disabled while offline so the player re-issues on reconnect). A reachability watcher (profile.get probe) and any successful traffic clear the signal. - the old red error.unavailable toast is gone (handleError suppresses connection codes; the indicator replaces it). A server-data screen still opens with the spinner and fills on reconnect (global indicator + read auto-retry), so navigation is never dead. - pure retry policy unit-tested (retry.ts); a mock-only window.__conn hook drives a Chromium+WebKit e2e (indicator shows offline, the action disables, both clear on reconnect). Full suite + build green. - docs: ARCHITECTURE transport note, FUNCTIONAL (+ _ru), PLAN tracker (incl. #1 — the bot already drains all updates, no change). Also records #1 as investigated/no-change in PLAN. Other server-action buttons (chat send, profile save, …) still degrade to a safe no-op offline; visual disable is easy to extend.
This commit is contained in:
@@ -16,6 +16,25 @@ async function openGame(page: Page): Promise<void> {
|
||||
await expect(page.locator('.pane')).toHaveCount(1);
|
||||
}
|
||||
|
||||
test('offline shows the Connecting indicator and softly disables server actions (Stage 17)', async ({ page }) => {
|
||||
await openGame(page);
|
||||
// The exchange/draw tab is a server action; on my turn with tiles in the bag it is live.
|
||||
const draw = page.locator('.tab').first();
|
||||
await expect(draw).toBeEnabled();
|
||||
await expect(page.getByText('Connecting…')).toHaveCount(0);
|
||||
|
||||
// Drop the connection (mock-only hook): the header swaps the title for the spinner +
|
||||
// "Connecting…", and the server action goes inert.
|
||||
await page.evaluate(() => (window as unknown as { __conn: { offline(): void } }).__conn.offline());
|
||||
await expect(page.getByText('Connecting…')).toBeVisible();
|
||||
await expect(draw).toBeDisabled();
|
||||
|
||||
// Reconnect: the indicator clears and the action is live again.
|
||||
await page.evaluate(() => (window as unknown as { __conn: { online(): void } }).__conn.online());
|
||||
await expect(page.getByText('Connecting…')).toHaveCount(0);
|
||||
await expect(draw).toBeEnabled();
|
||||
});
|
||||
|
||||
test('placing a tile and confirming via ✅ commits the move', async ({ page }) => {
|
||||
await openGame(page);
|
||||
await page.locator('.rack .tile').first().click();
|
||||
|
||||
Reference in New Issue
Block a user