Fix timer toggle: manual control, starts from set value, syncs with modTimerRunning

This commit is contained in:
2026-04-08 19:25:22 -05:00
parent 3dc9bdcc21
commit 7e52e1768b

View File

@@ -86,6 +86,11 @@ function handle(msg){
room=msg.room; room=msg.room;
if(role==='mod'){renderMod();renderRoundButtons();} if(role==='mod'){renderMod();renderRoundButtons();}
else{renderPlayerBuzzer();startPlayerTimer();} 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; break;
case 'round_closed': case 'round_closed':
room=msg.room; room=msg.room;
@@ -96,15 +101,6 @@ function handle(msg){
room=msg.room; room=msg.room;
if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayerBuzzer(); if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayerBuzzer();
break; 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; room=msg.room;
if(role==='mod'){renderMod();renderRoundButtons();}else{renderPlayerBuzzer();addFeed(msg);} if(role==='mod'){renderMod();renderRoundButtons();}else{renderPlayerBuzzer();addFeed(msg);}
@@ -299,6 +295,37 @@ function modTimerReset(){
renderModTimerDisplay(); renderModTimerDisplay();
broadcastTimerToPlayers(modTimerRemaining,false); 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(){ function modTimerToggle(){
if(modTimerRunning){ if(modTimerRunning){
clearInterval(modTimerInterval);modTimerRunning=false; clearInterval(modTimerInterval);modTimerRunning=false;
@@ -338,23 +365,22 @@ function renderModTimerDisplay(){
const s=modTimerRemaining; const s=modTimerRemaining;
el.textContent=fmtTime(s); el.textContent=fmtTime(s);
el.className='timer-digits'+(s<=5?' danger':s<=10?' warn':''); el.className='timer-digits'+(s<=5?' danger':s<=10?' warn':'');
const tog=document.getElementById('timer-tog');
if(tog)tog.checked=modTimerRunning;
} }
function modTimerLoad(){ 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; modTimerRunning=false;
clearInterval(modTimerInterval); clearInterval(modTimerInterval);
document.getElementById('btn-timer-ss').textContent='START'; document.getElementById('btn-timer-ss').textContent='START';
document.getElementById('timer-tog').checked=false; // Keep toggle state as is - don't auto-uncheck
renderModTimerDisplay(); renderModTimerDisplay();
} }
function modTimerReset(){ function modTimerReset(){
clearInterval(modTimerInterval); clearInterval(modTimerInterval);
modTimerRunning=false; 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); modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30);
renderModTimerDisplay(); renderModTimerDisplay();
broadcastTimerToPlayers(modTimerRemaining,false); broadcastTimerToPlayers(modTimerRemaining,false);
@@ -374,53 +400,13 @@ function broadcastTimerToPlayers(sec,running){
function toggleRound(){ function toggleRound(){
if(room.buzzerState.roundOpen){ if(room.buzzerState.roundOpen){
ws_send({type:'close_round'}); ws_send({type:'close_round'});
// Pause timer if toggle is ON
if(document.getElementById('timer-tog').checked){
modTimerToggle();
}
} else { } else {
ws_send({type:'open_round'}); 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(){ function resumeRound(){
ws_send({type:'resume_round'}); 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(){ function renderRoundButtons(){
@@ -436,10 +422,6 @@ function renderRoundButtons(){
btn.className='btn btn-g btn-full'; btn.className='btn btn-g btn-full';
resumeBtn.style.display='block'; 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(); renderModPlayerList();
renderModTeams(); renderModTeams();
renderRoundButtons(); renderRoundButtons();
// Sync timer toggle with running state
document.getElementById('timer-tog').checked=modTimerRunning;
} }
function renderModBuzz(evt){ function renderModBuzz(evt){
@@ -568,6 +552,7 @@ function renderModSettings(){
renderLiveTeamNames(); renderLiveTeamNames();
renderRoundButtons(); renderRoundButtons();
renderModTimerDisplay(); renderModTimerDisplay();
document.getElementById('timer-tog').checked=modTimerRunning;
} }
function segActivate(groupId,val){ function segActivate(groupId,val){