}
async take_center_letter(tile) {
+ /* Optimistically add to rack so letters appear in keystroke
+ * order regardless of HTTP response timing. */
+ this.setState(prev => ({
+ claim_rack: [...prev.claim_rack, {
+ letter: tile.letter, source: "center", tile
+ }],
+ claim_center_tiles: [...prev.claim_center_tiles, tile],
+ center: prev.center.filter(t => t.id !== tile.id),
+ claim_error: null
+ }));
+
const response = await fetch_post_json("take-letter", {
letter_id: tile.id
});
- if (response.ok) {
+ if (!response.ok) {
+ /* Revert: remove from rack and restore to center. */
this.setState(prev => ({
- claim_rack: [...prev.claim_rack, {
- letter: tile.letter, source: "center", tile
- }],
- claim_center_tiles: [...prev.claim_center_tiles, tile],
- center: prev.center.filter(t => t.id !== tile.id),
- claim_error: null
+ claim_rack: prev.claim_rack.filter(
+ e => !(e.source === "center" && e.tile.id === tile.id)),
+ claim_center_tiles: prev.claim_center_tiles.filter(
+ t => t.id !== tile.id),
+ center: [...prev.center, tile]
}));
}
}