@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.
1 lines • 15.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/lib/ScormProvider.tsx","../src/lib/withScorm.tsx"],"names":["SCORM","debug","React","createContext","useCallback","useEffect","useState","ScoContext","formatSessionTime","__name","milliseconds","totalSeconds","hours","minutes","seconds","ScormProvider","children","version","isDebug","apiConnected","setApiConnected","learnerName","setLearnerName","completionStatus","setCompletionStatus","suspendData","setSuspendDataState","scormVersion","setScormVersion","createScormAPIConnection","closeScormAPIConnection","connected","learner","status","getSuspendData","setSuspendData","commitData","success","e","error","data","parsedData","locationData","score","sessionTime","commitSuccess","savedData","clearSuspendData","setStatus","setScore","set","key","value","get","useScorm","context","ScormProvider_default","withScorm","WrappedComponent","props","withScorm_default"],"mappings":"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","sourcesContent":["import { IScormContextProps } from \"@/@types/scorm-context-props\";\nimport { SCORM, debug } from \"pipwerks-scorm-api-wrapper\";\nimport React, {\n\tReactNode,\n\tcreateContext,\n\tuseCallback,\n\tuseEffect,\n\tuseState,\n} from \"react\";\nimport { Score } from \".\";\n\nexport const ScoContext = createContext<IScormContextProps | undefined>(\n\tundefined\n);\n\ninterface ScormProviderProps {\n\tchildren: ReactNode;\n\tversion?: \"1.2\" | \"2004\";\n\tdebug?: boolean;\n}\n\nconst formatSessionTime = (milliseconds: number): string => {\n\tconst totalSeconds = Math.floor(milliseconds / 1000);\n\tconst hours = Math.floor(totalSeconds / 3600);\n\tconst minutes = Math.floor((totalSeconds % 3600) / 60);\n\tconst seconds = totalSeconds % 60;\n\n\treturn `${hours.toString().padStart(2, \"0\")}:${minutes\n\t\t.toString()\n\t\t.padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}.00`;\n};\n\nconst ScormProvider: React.FC<ScormProviderProps> = ({\n\tchildren,\n\tversion,\n\tdebug: isDebug,\n}) => {\n\tconst [apiConnected, setApiConnected] = useState(false);\n\tconst [learnerName, setLearnerName] = useState(\"unknown\");\n\tconst [completionStatus, setCompletionStatus] = useState(\"unknown\");\n\tconst [suspendData, setSuspendDataState] = useState<Record<string, any>>({});\n\tconst [scormVersion, setScormVersion] = useState<string>(\"\");\n\n\tuseEffect(() => {\n\t\tcreateScormAPIConnection();\n\t\twindow.addEventListener(\"beforeunload\", closeScormAPIConnection);\n\t\treturn () => {\n\t\t\tcloseScormAPIConnection();\n\t\t\twindow.removeEventListener(\"beforeunload\", closeScormAPIConnection);\n\t\t};\n\t}, []);\n\n\tconst createScormAPIConnection = useCallback(() => {\n\t\tif (apiConnected) return;\n\n\t\tif (version) SCORM.version = version;\n\t\tif (typeof isDebug === \"boolean\") debug.isActive = isDebug;\n\n\t\tconst connected = SCORM.init();\n\t\tsetApiConnected(!!connected);\n\n\t\tif (connected) {\n\t\t\tconst version = SCORM.version;\n\t\t\tconst learner =\n\t\t\t\tversion === \"1.2\"\n\t\t\t\t\t? SCORM.get(\"cmi.core.student_name\")\n\t\t\t\t\t: SCORM.get(\"cmi.learner_name\");\n\t\t\tconst status = SCORM.status(\"get\");\n\n\t\t\tsetApiConnected(true);\n\t\t\tsetLearnerName(learner || \"unknown\");\n\t\t\tsetCompletionStatus(status || \"unknown\");\n\t\t\tsetScormVersion(version);\n\t\t\tgetSuspendData();\n\t\t} else {\n\t\t\tsetApiConnected(false);\n\t\t\tconsole.error(\n\t\t\t\t\"ScormProvider init error: could not create the SCORM API connection\"\n\t\t\t);\n\t\t}\n\t}, [apiConnected, version, isDebug]);\n\n\tconst closeScormAPIConnection = useCallback(() => {\n\t\tif (!apiConnected) return;\n\n\t\tsetSuspendData();\n\t\tSCORM.status(\"set\", completionStatus);\n\t\tSCORM.save();\n\n\t\tif (SCORM.quit()) {\n\t\t\tsetApiConnected(false);\n\t\t\tsetLearnerName(\"unknown\");\n\t\t\tsetCompletionStatus(\"unknown\");\n\t\t\tsetSuspendDataState({});\n\t\t\tsetScormVersion(\"\");\n\t\t} else {\n\t\t\tconsole.error(\"ScormProvider error: could not close the API connection\");\n\t\t}\n\t}, [apiConnected, completionStatus]);\n\n\t/**\n\t * @description Saves all current student progress to the LMS without ending the session (LMSCommit)\n\t * @example\n\t * commitData();\n\t * @returns {boolean} Returns true if the commit was successful, false otherwise\n\t * @throws {Error} If the SCORM API is not connected\n\t */\n\tconst commitData = useCallback((): boolean => {\n\t\tif (!apiConnected) {\n\t\t\tconsole.error(\"SCORM API não conectada no commit.\");\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tlet success = false;\n\t\t\tif (typeof SCORM.save === \"function\") {\n\t\t\t\tsuccess = SCORM.save() !== \"false\";\n\t\t\t}\n\t\t\tif (!success && SCORM.version === \"1.2\") {\n\t\t\t\ttry {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tsuccess = SCORM.API.LMSCommit(\"\") !== \"false\";\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn(\"Erro ao tentar LMSCommit direto:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!success) {\n\t\t\t\tconsole.error(\"Commit SCORM falhou.\");\n\t\t\t}\n\t\t\treturn success;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Erro no commit:\", error);\n\t\t\treturn false;\n\t\t}\n\t}, [apiConnected]);\n\n\tconst getSuspendData = useCallback(() => {\n\t\tif (!apiConnected) {\n\t\t\tthrow new Error(\"SCORM API não conectada\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst data = SCORM.get(\"cmi.suspend_data\");\n\t\t\tlet parsedData = {};\n\n\t\t\tif (data && data !== \"{}\") {\n\t\t\t\ttry {\n\t\t\t\t\tparsedData = JSON.parse(data);\n\t\t\t\t\tconsole.log(\"Dados recuperados de suspend_data com sucesso\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn(\"Erro ao processar dados de suspend_data:\", e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.warn(\"Nenhum dado encontrado em suspend_data\");\n\n\t\t\t\tconst locationData = SCORM.get(\"cmi.core.lesson_location\");\n\t\t\t\tif (locationData && locationData.includes(\"activityId=\")) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"Encontrado identificador em lesson_location:\",\n\t\t\t\t\t\tlocationData\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst status = SCORM.get(\"cmi.core.lesson_status\");\n\t\t\tif (status === \"completed\" || status === \"passed\") {\n\t\t\t\tconsole.log(\"Atividade já marcada como concluída no LMS\");\n\n\t\t\t\tconst score = SCORM.get(\"cmi.core.score.raw\");\n\t\t\t\tif (score) {\n\t\t\t\t\tconsole.log(\"Pontuação recuperada:\", score);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetSuspendDataState(parsedData);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Erro ao carregar suspend_data:\", error);\n\t\t\treturn false;\n\t\t}\n\t}, [apiConnected]);\n\n\tconst setSuspendData = useCallback(() => {\n\t\tif (!apiConnected) {\n\t\t\tconsole.warn(\"SCORM API não conectada, impossível salvar dados\");\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tSCORM.set(\"cmi.suspend_data\", JSON.stringify(suspendData));\n\n\t\t\tconst locationData = `activityId=${Object.keys(suspendData).join(\n\t\t\t\t\",\"\n\t\t\t)}&ts=${Date.now()}`;\n\t\t\tSCORM.set(\"cmi.core.lesson_location\", locationData);\n\n\t\t\tSCORM.set(\"cmi.core.exit\", \"suspend\");\n\n\t\t\tconst sessionTime = formatSessionTime(30 * 60 * 1000);\n\t\t\tSCORM.set(\"cmi.core.session_time\", sessionTime);\n\n\t\t\tconst status = SCORM.get(\"cmi.core.lesson_status\");\n\t\t\tif (status !== \"completed\" && status !== \"passed\") {\n\t\t\t\tSCORM.set(\"cmi.core.lesson_status\", \"incomplete\");\n\t\t\t}\n\n\t\t\tconst commitSuccess = commitData();\n\n\t\t\tconst savedData = SCORM.get(\"cmi.suspend_data\");\n\t\t\tif (!savedData || savedData === \"{}\") {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"Dados não foram persistidos corretamente no suspend_data\"\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn commitSuccess;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Erro ao salvar suspend_data:\", error);\n\t\t\treturn false;\n\t\t}\n\t}, [apiConnected, suspendData, commitData]);\n\n\tconst clearSuspendData = useCallback(() => setSuspendDataState({}), []);\n\n\tconst setStatus = useCallback(\n\t\t(status: string) => {\n\t\t\tif (!apiConnected) return;\n\t\t\tsetCompletionStatus(status);\n\t\t\tSCORM.status(\"set\", status);\n\t\t},\n\t\t[apiConnected]\n\t);\n\n\tconst setScore = useCallback(\n\t\t(score: Score): any => {\n\t\t\tif (!apiConnected) {\n\t\t\t\treturn new Error(\"SCORM API not connected\");\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tSCORM.set(\"cmi.score.raw\", score.value);\n\n\t\t\t\tif (scormVersion === \"2004\") {\n\t\t\t\t\tSCORM.set(\"cmi.score.min\", score.min);\n\t\t\t\t\tSCORM.set(\"cmi.score.max\", score.max);\n\t\t\t\t} else if (scormVersion === \"1.2\") {\n\t\t\t\t\tSCORM.set(\"cmi.core.score.min\", score.min);\n\t\t\t\t\tSCORM.set(\"cmi.core.score.max\", score.max);\n\t\t\t\t}\n\n\t\t\t\tif (score.status && score.status !== \"0\") {\n\t\t\t\t\tsetStatus(score.status);\n\t\t\t\t}\n\n\t\t\t\tconst saveResult = SCORM.save();\n\n\t\t\t\treturn saveResult;\n\t\t\t} catch (error) {\n\t\t\t\treturn error instanceof Error;\n\t\t\t}\n\t\t},\n\t\t[apiConnected, scormVersion, setStatus]\n\t);\n\n\tconst set = useCallback(\n\t\t(key: string, value: any) => {\n\t\t\tif (!apiConnected) return;\n\t\t\tSCORM.set(key, value);\n\t\t},\n\t\t[apiConnected]\n\t);\n\n\tconst get = useCallback(\n\t\t(key: string) => {\n\t\t\tif (!apiConnected) return null;\n\t\t\treturn SCORM.get(key);\n\t\t},\n\t\t[apiConnected]\n\t);\n\n\treturn (\n\t\t<ScoContext.Provider\n\t\t\tvalue={{\n\t\t\t\tapiConnected,\n\t\t\t\tlearnerName,\n\t\t\t\tcompletionStatus,\n\t\t\t\tsuspendData,\n\t\t\t\tscormVersion,\n\t\t\t\tgetSuspendData,\n\t\t\t\tsetSuspendData,\n\t\t\t\tclearSuspendData,\n\t\t\t\tsetStatus,\n\t\t\t\tsetScore,\n\t\t\t\tset,\n\t\t\t\tget,\n\t\t\t\tcommitData,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</ScoContext.Provider>\n\t);\n};\n\nexport const useScorm = (): IScormContextProps => {\n\tconst context = React.useContext(ScoContext);\n\tif (!context) {\n\t\tthrow new Error(\"useScorm must be used within a ScormProvider\");\n\t}\n\treturn context;\n};\n\nexport default ScormProvider;\n","import React from 'react';\nimport { ScoContext } from './ScormProvider';\n\nfunction withScorm() {\n\n return function(WrappedComponent) {\n\n const WithScorm = function(props) {\n return (\n <ScoContext.Consumer>\n {value => <WrappedComponent {...props} sco={value} />}\n </ScoContext.Consumer>\n )\n }\n\n return WithScorm;\n }\n}\n\nexport default withScorm;\n"]}