/* widget: Flitswoorden */
/* =========================================================
Flash words widget
==========================================================*/
function mountFlits(root, initState, opts){
const onProgress = opts && opts.onProgress;
const S = { level:1, yearGroup:null, managedLearningLevel:false, card:0, dur:2, idx:0, order:[], score:0, tries:0, assignmentWords:null, assignmentThemeName:"" };
if(initState){ S.level=initState.level||1;S.yearGroup=initState.yearGroup||null;S.managedLearningLevel=!!initState.managedLearningLevel;S.card = initState.card ?? 0; S.dur = initState.dur || 2; S.score=+initState.score||0; S.tries=+initState.tries||0;S.assignmentWords=Array.isArray(initState.assignmentWords)?initState.assignmentWords:null;S.assignmentThemeName=typeof initState.assignmentThemeName==="string"?initState.assignmentThemeName:""; }
const assignedRules=languageTaskRules(S.yearGroup,S.level);if(S.managedLearningLevel&&assignedRules)S.dur=assignedRules.flashSeconds;
let flashTimer = null, assessed=false;
root.innerHTML = `
`;
const el = s => root.querySelector(s);
const srcSel = el(".fl-src"), durSel = el(".fl-dur"),
wordEl = el(".fl-word"), picEl = el(".fl-pic"), cntEl = el(".fl-cnt"), reflect=el(".fl-reflect");
function list(){
if(S.assignmentWords?.length)return languageWidgetWords(S.assignmentWords,S.yearGroup,S.level,"flits");
S.card = normWordSource(S.card);const selected=languageWidgetWords(wordSourceList(S.card),S.yearGroup,S.level,"flits");
if(selected.length)return selected;S.card="g";return languageWidgetWords(wordSourceList("g"),S.yearGroup,S.level,"flits");
}
function buildSrc(){
if(S.assignmentWords?.length){srcSel.innerHTML="";srcSel.appendChild(new Option("🎯 "+(S.assignmentThemeName||T("castTheme")),"assignment"));srcSel.disabled=true;}
else{srcSel.disabled=false;fillWordSourceSel(srcSel, S.card,S.yearGroup,S.level);S.card=srcSel.value||"g";}
durSel.innerHTML = "";
[0.5,1,2,3,5].forEach(d=>{
const o = document.createElement("option");
o.value = d; o.textContent = d+" "+T("flSec");
durSel.appendChild(o);
});
durSel.value = S.dur;
}
function newRound(){
S.order = shuffle(list().map((_,i)=>i));
S.idx = 0;
}
function cur(){ return list()[S.order[S.idx]]; }
function score(){ cntEl.textContent = `${T("word")} ${S.idx+1}/${S.order.length} · ${T("flScore").replace("{score}",S.score)}`; }
function hide(ask=false){
wordEl.textContent = "• • •";
wordEl.classList.add("dim");
picEl.textContent = "";
reflect.hidden=!ask||assessed;
}
function flash(){
clearTimeout(flashTimer);
assessed=false;
wordEl.textContent = cur()[0];
wordEl.classList.remove("dim");
picEl.textContent = "";
reflect.hidden=true; score();
flashTimer = setTimeout(()=>hide(true), S.dur*1000);
}
function show(){
clearTimeout(flashTimer);
wordEl.textContent = cur()[0];
wordEl.classList.remove("dim");
setPic(picEl, cur()[1]);
reflect.hidden=assessed;
}
function assess(ok){
if(assessed)return;assessed=true;
S.tries++; if(ok){S.score++;sndGood();confetti(el('.mt-card'));}else sndBad();
/* de zelfcheck van de leerling ("gelukt" / "nog oefenen") was tot nu toe
alleen een sessieteller; het is het enige goed/fout-signaal dat deze
widget heeft en dus precies wat de voortgang bij taal miste */
if(onProgress) onProgress(languageProgressPayload({
word: cur()[0], solved: ok, stars: ok?1:0, selfCheck: true }));
score(); reflect.hidden=true;
}
el(".fl-flash").addEventListener("click", flash);
el(".fl-show").addEventListener("click", show);
el(".fl-got").addEventListener("click",()=>assess(true));
el(".fl-again").addEventListener("click",()=>assess(false));
el(".fl-next").addEventListener("click", ()=>{
S.idx++;
if(S.idx >= S.order.length){ celebrateAvatar(root); newRound(); }
flash();
});
srcSel.addEventListener("change", ()=>{
S.card = srcSel.value;
newRound(); hide();
cntEl.textContent = "";
});
durSel.addEventListener("change", ()=>{ S.dur = +durSel.value; });
function labels(){
el(".fl-flash").textContent = T("flFlash");
el(".fl-show").textContent = T("flShow");
el(".fl-next").textContent = T("flNext");
const letters=languageTaskRules(S.yearGroup,S.level)?.literacyMode==="letters";
el(".fl-mission").textContent=letters?(LANG==="nl"?"Bekijk en benoem de letter.":"Look at and name the letter."):T("flMission");
el(".fl-question").textContent=letters?(LANG==="nl"?"Herkende je de letter?":"Did you recognise the letter?"):T("flQuestion");
el(".fl-got").textContent=T("flGotIt");
el(".fl-again").textContent=T("flAgain");
buildSrc();
if(S.order.length)score();
}
document.addEventListener("langchange", ()=>{ if(!S.assignmentWords)S.card=0; labels(); newRound(); hide(); });
document.addEventListener("wordschange", ()=>{ buildSrc(); newRound(); hide(); });
labels(); newRound();
root.classList.toggle("managed-learning-level",S.managedLearningLevel);
return { getState: ()=>({card:S.card, dur:S.dur, score:S.score, tries:S.tries}) };
}