UNPKG

@code-by-dwayne/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.79 kB
import D, { createContext, useState, useEffect, useCallback } from 'react'; import { SCORM, debug } from 'pipwerks-scorm-api-wrapper'; var $=Object.defineProperty;var u=(s,c)=>$(s,"name",{value:c,configurable:!0});var l=createContext(void 0),W=u(s=>{let c=Math.floor(s/1e3),m=Math.floor(c/3600),t=Math.floor(c%3600/60),f=c%60;return `${m.toString().padStart(2,"0")}:${t.toString().padStart(2,"0")}:${f.toString().padStart(2,"0")}.00`},"formatSessionTime"),q=u(({children:s,version:c,debug:m})=>{let[t,f]=useState(!1),[E,h]=useState("unknown"),[M,A]=useState("unknown"),[g,v]=useState("unknown"),[p,w]=useState({}),[S,_]=useState("");useEffect(()=>(k(),window.addEventListener("beforeunload",C),()=>{C(),window.removeEventListener("beforeunload",C);}),[]);let k=useCallback(()=>{if(!t)if(c&&(SCORM.version=c),typeof m=="boolean"&&(debug.isActive=m),SCORM.init()){let o=SCORM.version,r=o==="1.2"?SCORM.get("cmi.core.student_name"):SCORM.get("cmi.learner_name"),a=o==="1.2"?SCORM.get("cmi.core.student_id"):SCORM.get("cmi.learner_id"),n=SCORM.status("get");f(!0),h(r||"unknown"),A(a||"unknown"),v(n||"unknown"),_(o);}else console.error("ScormProvider init error: could not create the SCORM API connection");},[t,c,m]),C=useCallback(()=>{t&&(I(),SCORM.status("set",g),SCORM.save(),SCORM.quit()?(f(!1),h("unknown"),v("unknown"),w({}),_("")):console.error("ScormProvider error: could not close the API connection"));},[t,g]),P=useCallback(()=>{if(!t)throw new Error("SCORM API n\xE3o conectada");try{let o=SCORM.get("cmi.core.exit");(!o||o!=="suspend")&&SCORM.set("cmi.core.exit","suspend");let r=!1;if(typeof SCORM.save=="function"&&(r=SCORM.save()!=="false"),!r&&SCORM.version==="1.2")try{r=SCORM.API.LMSCommit("")!=="false";}catch(n){console.warn("Erro ao tentar LMSCommit direto:",n);}let a=SCORM.get("cmi.suspend_data");return (!a||a==="{}")&&console.warn("Commit n\xE3o persistiu dados em suspend_data"),r}catch(o){return console.error("Erro no commit:",o),!1}},[t]),R=useCallback(()=>{if(!t)throw new Error("SCORM API n\xE3o conectada");try{let o=SCORM.get("cmi.suspend_data"),r={};if(o&&o!=="{}")try{r=JSON.parse(o),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 a=SCORM.get("cmi.core.lesson_status");if(a==="completed"||a==="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 w(r),!0}catch(o){return console.error("Erro ao carregar suspend_data:",o),!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(p));let o=`activityId=${Object.keys(p).join(",")}&ts=${Date.now()}`;SCORM.set("cmi.core.lesson_location",o),SCORM.set("cmi.core.exit","suspend");let r=W(30*60*1e3);SCORM.set("cmi.core.session_time",r);let a=SCORM.get("cmi.core.lesson_status");a!=="completed"&&a!=="passed"&&SCORM.set("cmi.core.lesson_status","incomplete");let n=P(),y=SCORM.get("cmi.suspend_data");return !y||y==="{}"?(console.warn("Dados n\xE3o foram persistidos corretamente no suspend_data"),!1):n}catch(o){return console.error("Erro ao salvar suspend_data:",o),!1}},[t,p,P]),O=useCallback(()=>w({}),[]),x=useCallback(o=>{t&&(v(o),SCORM.status("set",o));},[t]),L=useCallback(async o=>{if(!t)return Promise.reject(new Error("SCORM API not connected"));try{SCORM.set("cmi.score.raw",o.value),S==="2004"?(SCORM.set("cmi.score.min",o.min),SCORM.set("cmi.score.max",o.max)):S==="1.2"&&(SCORM.set("cmi.core.score.min",o.min),SCORM.set("cmi.core.score.max",o.max)),o.status&&o.status!=="0"&&x(o.status);let r=SCORM.save();return Promise.resolve({success:!0,saveResult:r,score:o})}catch(r){return Promise.reject(r)}},[t,S,x]),N=useCallback((o,r)=>{t&&SCORM.set(o,r);},[t]),j=useCallback(o=>t?SCORM.get(o):null,[t]);return D.createElement(l.Provider,{value:{apiConnected:t,learnerName:E,learnerID:M,completionStatus:g,suspendData:p,scormVersion:S,getSuspendData:R,setSuspendData:I,clearSuspendData:O,setStatus:x,setScore:L,set:N,get:j,commitData:P}},s)},"ScormProvider"),F=u(()=>{let s=D.useContext(l);if(!s)throw new Error("useScorm must be used within a ScormProvider");return s},"useScorm"),z=q;function B(){return function(s){return u(function(m){return D.createElement(l.Consumer,null,t=>D.createElement(s,{...m,sco:t}))},"WithScorm")}}u(B,"withScorm");var G=B; export { l as ScoContext, z as ScormProvider, F as useScorm, G as withScorm }; //# sourceMappingURL=out.js.map //# sourceMappingURL=index.mjs.map