Say so when the browser refuses to save #77
Closed
jheaps
wants to merge 1 commits from
fix/casino-holdem-say-when-not-saving into fix/casino-holdem-shortcut-discovery
pull from: fix/casino-holdem-say-when-not-saving
merge into: :fix/casino-holdem-shortcut-discovery
:master
:feature/socialism
:polish/holdem-seats-one-size
:fix/holdem-dealer-chip-eats-its-seat
:polish/holdem-game-night-ready
:polish/holdem-round-next
:polish/holdem-seat-collisions
:polish/holdem-offline-and-render
:fix/naming-a-blind-deals-the-hand
:release/casino-holdem-polish
:fix/casino-holdem-phone-look
:fix/casino-holdem-sidebar-crowding
:fix/casino-holdem-contribution-rule
:fix/casino-holdem-one-stack-rule
:fix/casino-holdem-default-stack-buyin
:feat/casino-holdem-waiting-list
:feat/casino-holdem-misdeal
:feat/casino-holdem-cash-out
:feat/casino-holdem-clock
:feat/casino-holdem-rake
:fix/casino-holdem-stadium-ring
:fix/casino-holdem-phone-felt-shape
:fix/casino-holdem-audit-runs-everything
:feat/casino-holdem-straddle
:fix/casino-holdem-landscape-ring
:feat/casino-holdem-table-file
:fix/casino-holdem-touch-targets
:fix/casino-holdem-audit-modal-blindspot
:fix/casino-holdem-quicksplit-chop
:fix/casino-holdem-buildable-bet-sizes
:fix/casino-holdem-pot-sized-raise
:fix/casino-holdem-chips-to-count-out
:fix/casino-holdem-first-buy-in
:fix/casino-holdem-seating-a-table
:fix/casino-holdem-showdown-order
:fix/casino-holdem-hand-log-filter
:fix/casino-holdem-posting-in
:fix/casino-holdem-dead-button
:fix/casino-holdem-discarded-pot
:fix/casino-holdem-honest-tank-clock
:fix/casino-holdem-export-the-notes
:fix/casino-holdem-stacks-in-chips
:fix/casino-holdem-close-audit-blind-spots
:fix/casino-holdem-readable-dim-states
:fix/casino-holdem-drop-broken-watermark
:fix/casino-holdem-two-tabs
:fix/casino-holdem-unreadable-save
:fix/casino-holdem-say-when-not-saving
:fix/casino-holdem-shortcut-discovery
:fix/casino-holdem-rulings-index-compact
:fix/casino-holdem-rulings-index
:fix/casino-holdem-payout-in-chips
:fix/casino-holdem-move-seat-on-touch
:fix/casino-holdem-amount-fields-select
:fix/casino-holdem-touch-targets-by-pointer
:fix/casino-holdem-button-box-model
:fix/casino-holdem-blind-badge-placement
:fix/casino-holdem-buyin-deals-in
:fix/casino-holdem-bet-vs-raise
:fix/casino-holdem-deal-around-broke
:fix/casino-holdem-settle-up
:fix/casino-holdem-allin-and-bar
:fix/casino-holdem-one-dealer-button
:fix/casino-holdem-manual-deal
:fix/casino-holdem-less-guessing
:feature/casino-holdem-seat-editor
:fix/casino-holdem-landscape-table
:feature/casino-holdem-acting-seat
:feature/casino-holdem-raise-guard
:feature/casino-holdem-first-run
:feature/casino-holdem-contrast-audit
:feature/casino-holdem-layout-audit
:feature/casino-holdem-blind-fairness
:feature/casino-holdem-rulings-depth
:feature/casino-holdem-bank-audit
:feature/casino-holdem-fewer-taps
:feature/casino-holdem-render-perf
:feature/casino-holdem-keyboard-focus
:feature/casino-holdem-resilience
:feature/casino-holdem-messy-tables
:feature/casino-holdem-touch-mobile
:chore/casino-holdem-tech-debt
:feature/casino-holdem-dealer-batch
:feature/casino-holdem-seat-count-safety
:feature/casino-holdem-odd-chip
:feature/casino-holdem-button-moves
:feature/casino-holdem-allin-runout
:feature/casino-holdem-heads-up
:feature/casino-holdem-contrast
:feature/casino-holdem-touch-audit
:feature/casino-holdem-wizard-polish
:feature/casino-quicksplit-side-pots
:feature/casino-holdem-rebuys
:feature/casino-holdem-rulings
:feature/casino-holdem-sidebar-polish
:feature/casino-holdem-keyboard
:feature/casino-holdem-action-undo
:feature/casino-holdem-pace
:feature/casino-holdem-side-pot-breakdown
:feature/casino-holdem-gestures
:feature/casino-holdem-card-picker
:feature/casino-holdem-live-betting
:feature/casino-holdem-bet-chips
:feature/casino-holdem-seat-legibility
:feature/casino-holdem-undo-toasts
:feature/casino-holdem-quick-split
:feature/casino-holdem-mobile-table
:feature/casino-holdem-hand-history
:feature/casino-texas-holdem
:feature/casino-holdem-dealer-mode-polish
:feature/fractional-learned-weights
:fix/stockfish-dispose-hang
:fix/blog-cache-staleness
:fix/workflows
:gitea/workflows
:echo-acoustic-ranging
:chess-ui-overhaul
:feature/customChessEngine
:feature/blog
:AddProject
:feature/generalUpdate
:tech-debt/chess-cleanup
:tests/CreatePlaywrightTests
:UpdateParticleSimulatorButton
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Every save goes through one try/catch, and the catch was empty: Stacked on #76.
The comment is accurate and the behaviour is right — the chips have already moved in memory and refusing to continue would be worse. What was missing is anybody being told. Driven with
setItemthrowing: two saves failed, no toast, nothing on the page, and a refresh came back to before the hand was dealt with the dealer none the wiser.That's the same shape of fault the bank reconciliation exists for. Silent until it's too late to act on, and the way you find out is the last two players cashing out.
Said twice, for the two timescales
A toast the first time, and only the first time — a dealer taps this bar thirty times a hand and doesn't need thirty warnings. Measured: four failed saves, one toast.
And a standing line at the top of the Session panel, because a toast is a moment and this is a fact about the rest of the night. The raise pad dismisses toasts, and the one warning that must not be missed isn't the one to leave to a toast.
Amber, like the bank check's disagreement, because both mean the same thing: your record of the night is wrong and you can still do something about it. The export is named because it's the thing that helps.
Validation
6 tests (255 total): a good save reports success and leaves no mark, a failing one reports failure rather than throwing, the listener fires exactly once across twenty failures, it's handed the error so the reason can be reported later, a failing save still doesn't stop the table, and no listener at all isn't an error.
Driven through the UI with
setItemthrowing: hidden while saving works, toast on the first failure, zero further toasts across three more actions, the panel line present and readable. Contrast clean, layout audit clean, no console errors.Every save goes through one try/catch, and the catch was empty: } catch { // Storage full/unavailable (private browsing, etc.) — the table still works // for the rest of the session, it just won't survive a refresh. } The comment is accurate and the behaviour is right -- the chips have already moved in memory and refusing to continue would be worse. What was missing is anybody being told. Driven with setItem throwing: two saves failed, no toast, nothing on the page, and a refresh came back to before the hand was dealt with the dealer none the wiser. That is the same shape of fault the bank reconciliation exists for. Silent until it is too late to act on, and the way you find out is the last two players cashing out. Now it says so twice, in the two places that suit the two timescales. A toast the first time, and only the first time -- a dealer taps this bar thirty times a hand and does not need thirty warnings. Measured: four failed saves, one toast. "This table isn't being saved — refreshing would lose it. Keep this tab open." And a standing line at the top of the Session panel, because a toast is a moment and this is a fact about the rest of the night. The raise pad dismisses toasts, and the one warning that must not be missed is not the one to leave to a toast. "This table isn't being saved — the browser refused. It'll keep working, but closing or refreshing this tab loses the session. Export CSV below keeps a copy." Amber, like the bank check's disagreement, because both mean the same thing: your record of the night is wrong and you can still do something about it. The export is named because it is the thing that helps. 6 tests (255 total): a good save reports success and leaves no mark, a failing one reports failure rather than throwing, the listener fires exactly once across twenty failures, it is handed the error so the reason can be reported later, a failing save still does not stop the table, and no listener at all is not an error. Driven through the UI with setItem throwing: hidden while saving works, toast on the first failure, zero further toasts across three more actions, the panel line present and readable. Contrast clean, layout audit clean, no console errors. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgbPull request closed