dragging_center_tile: null
};
this._claim_interval = null;
+ this._taking_tiles = new Set(); /* tile IDs with in-flight take requests */
}
componentDidMount() {
}
async take_center_letter(tile) {
+ /* Guard against duplicate takes of the same tile (e.g. rapid
+ * double-tap on mobile before React processes the first setState). */
+ if (this._taking_tiles.has(tile.id)) return;
+ this._taking_tiles.add(tile.id);
+
/* Optimistically add to rack so letters appear in keystroke
* order regardless of HTTP response timing. */
this.setState(prev => ({
const response = await fetch_post_json("take-letter", {
letter_id: tile.id
});
+ this._taking_tiles.delete(tile.id);
if (!response.ok) {
/* Revert: remove from rack and restore to center. */
this.setState(prev => ({