All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 47s
115 lines
3.9 KiB
JavaScript
115 lines
3.9 KiB
JavaScript
/* 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();
|
||
};
|