From 5eae6e6cd0118ba01dd1abb02882e6dceed81d30 Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Mon, 5 Jan 2026 21:28:00 +0100 Subject: [PATCH] fix(websocket): persist reconnect counter across retry attempts Move reconnectAttempts from local variable to useRef so it persists across recursive connectWebSocket calls. Previously, each call reset the counter to 0, causing infinite reconnection attempts instead of stopping at the max of 5. Also reset the counter on successful connection (onopen) so fresh reconnection attempts get full retries. --- providers/WebSocketProvider.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/providers/WebSocketProvider.tsx b/providers/WebSocketProvider.tsx index 6553e7ab..f6e49b88 100644 --- a/providers/WebSocketProvider.tsx +++ b/providers/WebSocketProvider.tsx @@ -8,6 +8,7 @@ import { useContext, useEffect, useMemo, + useRef, useState, } from "react"; import { AppState, type AppStateStatus } from "react-native"; @@ -42,6 +43,7 @@ export const WebSocketProvider = ({ children }: WebSocketProviderProps) => { const deviceId = useMemo(() => { return getOrSetDeviceId(); }, []); + const reconnectAttemptsRef = useRef(0); const connectWebSocket = useCallback(() => { if (!deviceId || !api?.accessToken) { @@ -58,9 +60,13 @@ export const WebSocketProvider = ({ children }: WebSocketProviderProps) => { const newWebSocket = new WebSocket(url); let keepAliveInterval: ReturnType | null = null; + const maxReconnectAttempts = 5; + const reconnectDelay = 10000; + newWebSocket.onopen = () => { console.log("WebSocket connection opened"); setIsConnected(true); + reconnectAttemptsRef.current = 0; keepAliveInterval = setInterval(() => { if (newWebSocket.readyState === WebSocket.OPEN) { newWebSocket.send(JSON.stringify({ MessageType: "KeepAlive" })); @@ -68,18 +74,16 @@ export const WebSocketProvider = ({ children }: WebSocketProviderProps) => { }, 30000); }; - let reconnectAttempts = 0; - const maxReconnectAttempts = 5; - const reconnectDelay = 10000; - newWebSocket.onerror = (e) => { console.error("WebSocket error:", e); setIsConnected(false); - if (reconnectAttempts < maxReconnectAttempts) { - reconnectAttempts++; + if (reconnectAttemptsRef.current < maxReconnectAttempts) { + reconnectAttemptsRef.current++; setTimeout(() => { - console.log(`WebSocket reconnect attempt ${reconnectAttempts}`); + console.log( + `WebSocket reconnect attempt ${reconnectAttemptsRef.current}`, + ); connectWebSocket(); }, reconnectDelay); } else {