Fix draft state not updating when returning from backgrounded mobile app
Mobile browsers suspend JavaScript and silently drop WebSocket connections when the user switches to another app, without firing "offline"/"online" events. Add a visibilitychange handler so that when the user returns: - If the socket is disconnected, reconnect immediately (skipping backoff) - If the socket appears connected but JS was suspended, rejoin the draft room and trigger a loader revalidation to catch any missed picks/state https://claude.ai/code/session_016tCZVFjSeHdQsdKktbDHEt
This commit is contained in:
parent
64a60a75d8
commit
96f02d2643
1 changed files with 19 additions and 0 deletions
|
|
@ -93,12 +93,31 @@ export function useDraftSocket(seasonId: string, teamId?: string): UseDraftSocke
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleVisibilityChange = () => {
|
||||||
|
if (document.visibilityState !== "visible") return;
|
||||||
|
|
||||||
|
if (!socketRef.current?.connected) {
|
||||||
|
// Mobile browsers kill WebSockets when the app is backgrounded without
|
||||||
|
// firing "offline". Reconnect immediately when the user returns.
|
||||||
|
socketRef.current?.connect();
|
||||||
|
} else {
|
||||||
|
// Socket appears connected but may have gone stale while JS was suspended.
|
||||||
|
// Rejoin the draft room (idempotent) and bump reconnectCount so the draft
|
||||||
|
// page revalidates loader data to catch any picks/state changes missed
|
||||||
|
// while the browser was backgrounded.
|
||||||
|
socketRef.current?.emit("join-draft", seasonId, teamId);
|
||||||
|
setReconnectCount((c) => c + 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
window.addEventListener("offline", handleOffline);
|
window.addEventListener("offline", handleOffline);
|
||||||
window.addEventListener("online", handleOnline);
|
window.addEventListener("online", handleOnline);
|
||||||
|
document.addEventListener("visibilitychange", handleVisibilityChange);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
window.removeEventListener("offline", handleOffline);
|
window.removeEventListener("offline", handleOffline);
|
||||||
window.removeEventListener("online", handleOnline);
|
window.removeEventListener("online", handleOnline);
|
||||||
|
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
||||||
console.log("Leaving draft room:", seasonId);
|
console.log("Leaving draft room:", seasonId);
|
||||||
socket.emit("leave-draft", seasonId);
|
socket.emit("leave-draft", seasonId);
|
||||||
socket.disconnect();
|
socket.disconnect();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue