@erik-efl/react-scorm-provider
Version:
Modern React Components to easily enable SCORM API communication in React projects. Updated fork of the original react-scorm-provider.
8 lines (6 loc) • 4.47 kB
JavaScript
import { SCORM, debug } from 'pipwerks-scorm-api-wrapper';
import E, { createContext, useState, useEffect, useCallback } from 'react';
var L=Object.defineProperty;var u=(s,c)=>L(s,"name",{value:c,configurable:!0});var f=createContext(void 0),T=u(s=>{let c=Math.floor(s/1e3),i=Math.floor(c/3600),t=Math.floor(c%3600/60),d=c%60;return `${i.toString().padStart(2,"0")}:${t.toString().padStart(2,"0")}:${d.toString().padStart(2,"0")}.00`},"formatSessionTime"),V=u(({children:s,version:c,debug:i})=>{let[t,d]=useState(!1),[A,h]=useState("unknown"),[v,g]=useState("unknown"),[S,C]=useState({}),[p,_]=useState("");useEffect(()=>(R(),window.addEventListener("beforeunload",w),()=>{w(),window.removeEventListener("beforeunload",w);}),[]);let R=useCallback(()=>{if(t)return;c&&(SCORM.version=c),typeof i=="boolean"&&(debug.isActive=i);let e=SCORM.init();if(d(!!e),e){let r=SCORM.version,m=r==="1.2"?SCORM.get("cmi.core.student_name"):SCORM.get("cmi.learner_name"),n=SCORM.status("get");d(!0),h(m||"unknown"),g(n||"unknown"),_(r),y();}else d(!1),console.error("ScormProvider init error: could not create the SCORM API connection");},[t,c,i]),w=useCallback(()=>{t&&(I(),SCORM.status("set",v),SCORM.save(),SCORM.quit()?(d(!1),h("unknown"),g("unknown"),C({}),_("")):console.error("ScormProvider error: could not close the API connection"));},[t,v]),P=useCallback(()=>{if(!t)return console.error("SCORM API n\xE3o conectada no commit."),!1;try{let e=!1;if(typeof SCORM.save=="function"&&(e=SCORM.save()!=="false"),!e&&SCORM.version==="1.2")try{e=SCORM.API.LMSCommit("")!=="false";}catch(r){console.warn("Erro ao tentar LMSCommit direto:",r);}return e||console.error("Commit SCORM falhou."),e}catch(e){return console.error("Erro no commit:",e),!1}},[t]),y=useCallback(()=>{if(!t)throw new Error("SCORM API n\xE3o conectada");try{let e=SCORM.get("cmi.suspend_data"),r={};if(e&&e!=="{}")try{r=JSON.parse(e),console.log("Dados recuperados de suspend_data com sucesso");}catch(n){console.warn("Erro ao processar dados de suspend_data:",n);}else {console.warn("Nenhum dado encontrado em suspend_data");let n=SCORM.get("cmi.core.lesson_location");n&&n.includes("activityId=")&&console.log("Encontrado identificador em lesson_location:",n);}let m=SCORM.get("cmi.core.lesson_status");if(m==="completed"||m==="passed"){console.log("Atividade j\xE1 marcada como conclu\xEDda no LMS");let n=SCORM.get("cmi.core.score.raw");n&&console.log("Pontua\xE7\xE3o recuperada:",n);}return C(r),!0}catch(e){return console.error("Erro ao carregar suspend_data:",e),!1}},[t]),I=useCallback(()=>{if(!t)return console.warn("SCORM API n\xE3o conectada, imposs\xEDvel salvar dados"),!1;try{SCORM.set("cmi.suspend_data",JSON.stringify(S));let e=`activityId=${Object.keys(S).join(",")}&ts=${Date.now()}`;SCORM.set("cmi.core.lesson_location",e),SCORM.set("cmi.core.exit","suspend");let r=T(30*60*1e3);SCORM.set("cmi.core.session_time",r);let m=SCORM.get("cmi.core.lesson_status");m!=="completed"&&m!=="passed"&&SCORM.set("cmi.core.lesson_status","incomplete");let n=P(),b=SCORM.get("cmi.suspend_data");return !b||b==="{}"?(console.warn("Dados n\xE3o foram persistidos corretamente no suspend_data"),!1):n}catch(e){return console.error("Erro ao salvar suspend_data:",e),!1}},[t,S,P]),D=useCallback(()=>C({}),[]),x=useCallback(e=>{t&&(g(e),SCORM.status("set",e));},[t]),O=useCallback(e=>{if(!t)return new Error("SCORM API not connected");try{return SCORM.set("cmi.score.raw",e.value),p==="2004"?(SCORM.set("cmi.score.min",e.min),SCORM.set("cmi.score.max",e.max)):p==="1.2"&&(SCORM.set("cmi.core.score.min",e.min),SCORM.set("cmi.core.score.max",e.max)),e.status&&e.status!=="0"&&x(e.status),SCORM.save()}catch(r){return r instanceof Error}},[t,p,x]),k=useCallback((e,r)=>{t&&SCORM.set(e,r);},[t]),N=useCallback(e=>t?SCORM.get(e):null,[t]);return E.createElement(f.Provider,{value:{apiConnected:t,learnerName:A,completionStatus:v,suspendData:S,scormVersion:p,getSuspendData:y,setSuspendData:I,clearSuspendData:D,setStatus:x,setScore:O,set:k,get:N,commitData:P}},s)},"ScormProvider"),W=u(()=>{let s=E.useContext(f);if(!s)throw new Error("useScorm must be used within a ScormProvider");return s},"useScorm"),q=V;function F(){return function(s){return u(function(i){return E.createElement(f.Consumer,null,t=>E.createElement(s,{...i,sco:t}))},"WithScorm")}}u(F,"withScorm");var z=F;
export { f as ScoContext, q as ScormProvider, W as useScorm, z as withScorm };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=index.mjs.map