/* Live terugkanaal voor leerkrachtacties. Berichten worden via SSE direct gemeld en daarna via de duurzame API opgehaald en bevestigd. */ "use strict"; let pupilActionSource=null; let pupilActionFallback=null; let pupilActionNoticeTimer=null; let pupilActionLoading=false; function ensurePupilActionUi(){ let notice=document.getElementById("pupilLiveNotice"); if(!notice){ notice=document.createElement("aside"); notice.id="pupilLiveNotice"; notice.className="pupil-live-notice"; notice.setAttribute("role","status"); notice.setAttribute("aria-live","polite"); notice.hidden=true; document.body.appendChild(notice); } let pause=document.getElementById("pupilPauseShield"); if(!pause){ pause=document.createElement("aside"); pause.id="pupilPauseShield"; pause.className="pupil-pause-shield"; pause.setAttribute("role","status"); const icon=document.createElement("span");icon.textContent="⏸"; const title=document.createElement("strong");title.textContent=T("pupilPausedTitle"); const text=document.createElement("span");text.textContent=T("pupilPausedText"); pause.append(icon,title,text); document.body.appendChild(pause); } return{notice,pause}; } function setPupilPaused(paused){ const ui=ensurePupilActionUi(); document.body.classList.toggle("pupil-session-paused",!!paused); ui.pause.hidden=!paused; } function showPupilLiveAction(action){ const ui=ensurePupilActionUi(); if(action.kind==="pause"){setPupilPaused(true);return;} if(action.kind==="resume")setPupilPaused(false); let text=action.message||""; if(action.kind==="easier"){ text=T("pupilEasierReady") .replace("{group}",action.payload?.yearGroup||"–") .replace("{level}",action.payload?.level||"–"); pupilLastSig=null; pupilPoll(); }else if(!text){ text=T(action.kind==="resume"?"pupilResumeMessage":"pupilTeacherMessage"); } ui.notice.className="pupil-live-notice "+action.kind; ui.notice.textContent=(action.kind==="encourage"?"👏 ":action.kind==="hint"?"💡 ":"")+" "+text; ui.notice.hidden=false; clearTimeout(pupilActionNoticeTimer); pupilActionNoticeTimer=setTimeout(()=>{ui.notice.hidden=true;},8000); } async function loadPupilLiveActions(){ if(pupilActionLoading||!currentUser||currentUser.role!=="pupil")return; pupilActionLoading=true; try{ const result=await api("/my/live-actions"); setPupilPaused(result.paused); for(const action of result.actions||[]){ showPupilLiveAction(action); await api("/my/live-actions/"+encodeURIComponent(action.id)+"/ack",{method:"POST"}); } }catch(error){ if(error.status===401||error.status===403)stopPupilLiveActions(); }finally{pupilActionLoading=false;} } function startPupilLiveActions(){ stopPupilLiveActions(); ensurePupilActionUi(); loadPupilLiveActions(); if(typeof EventSource!=="undefined"){ pupilActionSource=new EventSource("/api/my/live-actions/stream"); pupilActionSource.addEventListener("actions",loadPupilLiveActions); } pupilActionFallback=setInterval(loadPupilLiveActions,15000); } function stopPupilLiveActions(){ if(pupilActionSource){pupilActionSource.close();pupilActionSource=null;} clearInterval(pupilActionFallback);pupilActionFallback=null; clearTimeout(pupilActionNoticeTimer); setPupilPaused(false); const notice=document.getElementById("pupilLiveNotice"); if(notice)notice.hidden=true; } document.addEventListener("langchange",()=>{ const pause=document.getElementById("pupilPauseShield"); if(pause){ pause.querySelector("strong").textContent=T("pupilPausedTitle"); pause.querySelector("span:last-child").textContent=T("pupilPausedText"); } }); const startPupilViewWithoutActions=startPupilView; startPupilView=function(){ startPupilViewWithoutActions(); startPupilLiveActions(); }; const stopPupilViewWithoutActions=stopPupilView; stopPupilView=function(){ stopPupilLiveActions(); stopPupilViewWithoutActions(); };