From 7e52e1768bb51f88b8532ee5145b848f3d285bbe Mon Sep 17 00:00:00 2001 From: KeshavAnandCode Date: Wed, 8 Apr 2026 19:25:22 -0500 Subject: [PATCH] Fix timer toggle: manual control, starts from set value, syncs with modTimerRunning --- src/public/script.js | 105 +++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 60 deletions(-) diff --git a/src/public/script.js b/src/public/script.js index f669cb1..aeddeb9 100644 --- a/src/public/script.js +++ b/src/public/script.js @@ -86,8 +86,13 @@ function handle(msg){ room=msg.room; if(role==='mod'){renderMod();renderRoundButtons();} else{renderPlayerBuzzer();startPlayerTimer();} + // If timer is enabled and this is a fresh open, load the timer + if(room.settings.timerSeconds>0 && modTimerRemaining===0 && !modTimerRunning){ + modTimerRemaining=room.settings.timerSeconds; + renderModTimerDisplay(); + } break; - case 'round_closed': + case 'round_closed': room=msg.room; if(role==='mod'){renderMod();renderRoundButtons();toast('ROUND CLOSED','warn');} else{renderPlayerBuzzer();stopPlayerTimer();} @@ -96,16 +101,7 @@ function handle(msg){ room=msg.room; if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayerBuzzer(); break; - case 'round_closed': - room=msg.room; - if(role==='mod')renderMod(); - else{renderPlayerBuzzer();stopPlayerTimer();toast('ROUND CLOSED','warn');} - break; - case 'buzzer_reset': - room=msg.room; - if(role==='mod')renderMod();else renderPlayerBuzzer(); - break; - case 'buzz_event': + case 'buzz_event': room=msg.room; if(role==='mod'){renderMod();renderRoundButtons();}else{renderPlayerBuzzer();addFeed(msg);} break; @@ -299,6 +295,37 @@ function modTimerReset(){ renderModTimerDisplay(); broadcastTimerToPlayers(modTimerRemaining,false); } +function modTimerToggle(){ + if(modTimerRunning){ + clearInterval(modTimerInterval);modTimerRunning=false; + document.getElementById('btn-timer-ss').textContent='START'; + broadcastTimerToPlayers(modTimerRemaining,false); + } else { + if(modTimerRemaining<=0)modTimerLoad(); + modTimerRunning=true; + document.getElementById('btn-timer-ss').textContent='PAUSE'; + broadcastTimerToPlayers(modTimerRemaining,true); + modTimerInterval=setInterval(()=>{ + modTimerRemaining--; + renderModTimerDisplay(); + broadcastTimerToPlayers(modTimerRemaining,true); + if(modTimerRemaining<=0){ + clearInterval(modTimerInterval);modTimerRunning=false; + document.getElementById('btn-timer-ss').textContent='START'; + ws_send({type:'close_round'}); + toast('TIME UP — round closed','warn'); + if(typeof gsap!=='undefined'){ + gsap.to('#mod-timer-disp',{scale:1.08,duration:0.1,yoyo:true,repeat:3,ease:'power2.inOut'}); + } + } + },1000); + } +} + +function toggleTimer(){ + modTimerToggle(); +} + function modTimerToggle(){ if(modTimerRunning){ clearInterval(modTimerInterval);modTimerRunning=false; @@ -338,23 +365,22 @@ function renderModTimerDisplay(){ const s=modTimerRemaining; el.textContent=fmtTime(s); el.className='timer-digits'+(s<=5?' danger':s<=10?' warn':''); - const tog=document.getElementById('timer-tog'); - if(tog)tog.checked=modTimerRunning; } function modTimerLoad(){ - modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30); + const sec=parseInt(document.getElementById('mod-timer-set').value)||30; + modTimerRemaining=sec; modTimerRunning=false; clearInterval(modTimerInterval); document.getElementById('btn-timer-ss').textContent='START'; - document.getElementById('timer-tog').checked=false; + // Keep toggle state as is - don't auto-uncheck renderModTimerDisplay(); } function modTimerReset(){ clearInterval(modTimerInterval); modTimerRunning=false; - document.getElementById('timer-tog').checked=false; + // Keep toggle state as is - don't auto-uncheck modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30); renderModTimerDisplay(); broadcastTimerToPlayers(modTimerRemaining,false); @@ -374,53 +400,13 @@ function broadcastTimerToPlayers(sec,running){ function toggleRound(){ if(room.buzzerState.roundOpen){ ws_send({type:'close_round'}); - // Pause timer if toggle is ON - if(document.getElementById('timer-tog').checked){ - modTimerToggle(); - } } else { ws_send({type:'open_round'}); - // Start timer if toggle is ON - if(document.getElementById('timer-tog').checked){ - modTimerLoad(); - modTimerRunning=true; - document.getElementById('btn-timer-ss').textContent='PAUSE'; - modTimerInterval=setInterval(()=>{ - modTimerRemaining--; - renderModTimerDisplay(); - broadcastTimerToPlayers(modTimerRemaining,true); - if(modTimerRemaining<=0){ - clearInterval(modTimerInterval);modTimerRunning=false; - document.getElementById('btn-timer-ss').textContent='START'; - document.getElementById('timer-tog').checked=false; - ws_send({type:'close_round'}); - toast('TIME UP — round closed','warn'); - } - },1000); - } } } function resumeRound(){ ws_send({type:'resume_round'}); - // Resume timer if toggle is ON - if(document.getElementById('timer-tog').checked){ - modTimerLoad(); - modTimerRunning=true; - document.getElementById('btn-timer-ss').textContent='PAUSE'; - modTimerInterval=setInterval(()=>{ - modTimerRemaining--; - renderModTimerDisplay(); - broadcastTimerToPlayers(modTimerRemaining,true); - if(modTimerRemaining<=0){ - clearInterval(modTimerInterval);modTimerRunning=false; - document.getElementById('btn-timer-ss').textContent='START'; - document.getElementById('timer-tog').checked=false; - ws_send({type:'close_round'}); - toast('TIME UP — round closed','warn'); - } - },1000); - } } function renderRoundButtons(){ @@ -436,10 +422,6 @@ function renderRoundButtons(){ btn.className='btn btn-g btn-full'; resumeBtn.style.display='block'; } - - // Sync timer toggle state with modTimerRunning - const tog=document.getElementById('timer-tog'); - if(tog){tog.checked=modTimerRunning;} } // ══════════════════════════════════════════════════════ @@ -464,6 +446,8 @@ function renderMod(){ renderModPlayerList(); renderModTeams(); renderRoundButtons(); + // Sync timer toggle with running state + document.getElementById('timer-tog').checked=modTimerRunning; } function renderModBuzz(evt){ @@ -568,6 +552,7 @@ function renderModSettings(){ renderLiveTeamNames(); renderRoundButtons(); renderModTimerDisplay(); + document.getElementById('timer-tog').checked=modTimerRunning; } function segActivate(groupId,val){