diff --git a/components/lottery/LotteryWinnersSection.tsx b/components/lottery/LotteryWinnersSection.tsx index 0e35411..f35aadc 100644 --- a/components/lottery/LotteryWinnersSection.tsx +++ b/components/lottery/LotteryWinnersSection.tsx @@ -38,6 +38,7 @@ const LotteryWinnersSection = ({ lotteryStatus }: { lotteryStatus: string }) => const pingIntervalRef = useRef(null); const reconnectTimeoutRef = useRef(null); const mountedRef = useRef(false); + let reconnectAttempts: number; // Initialize winners from lottery data useEffect(() => { @@ -52,56 +53,58 @@ const LotteryWinnersSection = ({ lotteryStatus }: { lotteryStatus: string }) => } }, [lotteryData]); - // WebSocket Setup useEffect(() => { mountedRef.current = true; const setupWebSocket = () => { - if (wsRef.current) return; // Prevent duplicate connections + if (wsRef.current) return; try { const socket = new WebSocket(WEBSOCKET_URL); wsRef.current = socket; socket.addEventListener('open', () => { - console.log('WebSocket Connected'); + console.log('✅ WebSocket Connected'); setWsStatus('connected'); - - pingIntervalRef.current = setInterval(() => { - if (socket.readyState === WebSocket.OPEN) { - socket.send(JSON.stringify({ type: 'ping' })); - } - }, PING_INTERVAL); + reconnectAttempts = 0; // Reset reconnect attempts }); socket.addEventListener('message', handleWebSocketMessage); - socket.addEventListener('error', () => { - console.error('WebSocket Error'); + socket.addEventListener('error', (error) => { + console.error('❌ WebSocket Error:', error); setWsStatus('error'); - reconnectWebSocket(); }); - socket.addEventListener('close', () => { - console.log('WebSocket Closed'); + socket.addEventListener('close', (event) => { + console.log('❌ WebSocket Closed:', event); + console.log(`Code: ${event.code}, Reason: ${event.reason}`); + setWsStatus('error'); - reconnectWebSocket(); + + // Only reconnect if closure is abnormal + if (event.code !== 1000) { + reconnectWebSocket(); + } }); } catch (error) { - console.error('Error creating WebSocket:', error); + console.error('❌ Error creating WebSocket:', error); setWsStatus('error'); reconnectWebSocket(); } }; const reconnectWebSocket = () => { - if (reconnectTimeoutRef.current) return; // Prevent multiple reconnect attempts + if (!mountedRef.current) return; + + const delay = Math.min(1000 * 2 ** reconnectAttempts, 30000); // Exponential backoff + reconnectAttempts += 1; + + console.log(`Reconnecting in ${delay / 1000} seconds...`); reconnectTimeoutRef.current = setTimeout(() => { - console.log('Reconnecting WebSocket...'); setupWebSocket(); - reconnectTimeoutRef.current = null; - }, RECONNECT_INTERVAL); + }, delay); }; setupWebSocket(); @@ -201,30 +204,28 @@ const LotteryWinnersSection = ({ lotteryStatus }: { lotteryStatus: string }) =>
- -
- {winnerSelectingStatus === 'not-selected' || - winnerSelectingStatus === 'is-selecting' ? ( +
+ {winnerSelectingStatus === 'not-selected' || + winnerSelectingStatus === 'is-selecting' ? ( + + ) : ( +
- ) : ( -
+ {winnerText && ( - {winnerText && ( - - )} -
- )} -
- + )} +
+ )} +
diff --git a/components/lottery/winners/LotteryWinnersList.tsx b/components/lottery/winners/LotteryWinnersList.tsx index 1f57c43..f1e1fef 100644 --- a/components/lottery/winners/LotteryWinnersList.tsx +++ b/components/lottery/winners/LotteryWinnersList.tsx @@ -15,17 +15,15 @@ const LotteryWinnersList = ({ winners }: { winners: LotteryWinnerDataSimplified[ - - {winners.map((item, index) => ( - - ))} - + {winners.map((item, index) => ( + + ))}
);