UNPKG

@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.

236 lines (235 loc) 9.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useScorm = exports["default"] = exports.ScoContext = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _pipwerksScormApiWrapper = require("pipwerks-scorm-api-wrapper"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var ScoContext = exports.ScoContext = /*#__PURE__*/(0, _react.createContext)(undefined); var ScormProvider = function ScormProvider(_ref) { var children = _ref.children, version = _ref.version, isDebug = _ref.debug; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), apiConnected = _useState2[0], setApiConnected = _useState2[1]; var _useState3 = (0, _react.useState)("unknown"), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), learnerName = _useState4[0], setLearnerName = _useState4[1]; var _useState5 = (0, _react.useState)("unknown"), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), completionStatus = _useState6[0], setCompletionStatus = _useState6[1]; var _useState7 = (0, _react.useState)({}), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), suspendData = _useState8[0], setSuspendDataState = _useState8[1]; var _useState9 = (0, _react.useState)(""), _useState10 = (0, _slicedToArray2["default"])(_useState9, 2), scormVersion = _useState10[0], setScormVersion = _useState10[1]; (0, _react.useEffect)(function () { createScormAPIConnection(); window.addEventListener("beforeunload", closeScormAPIConnection); return function () { closeScormAPIConnection(); window.removeEventListener("beforeunload", closeScormAPIConnection); }; }, []); var createScormAPIConnection = (0, _react.useCallback)(function () { if (apiConnected) return; if (version) _pipwerksScormApiWrapper.SCORM.version = version; if (typeof isDebug === "boolean") _pipwerksScormApiWrapper.debug.isActive = isDebug; if (_pipwerksScormApiWrapper.SCORM.init()) { var _version = _pipwerksScormApiWrapper.SCORM.version; var learner = _version === "1.2" ? _pipwerksScormApiWrapper.SCORM.get("cmi.core.student_name") : _pipwerksScormApiWrapper.SCORM.get("cmi.learner_name"); var status = _pipwerksScormApiWrapper.SCORM.status("get"); setApiConnected(true); setLearnerName(learner || "unknown"); setCompletionStatus(status || "unknown"); setScormVersion(_version); getSuspendData(); } else { console.error("ScormProvider init error: could not create the SCORM API connection"); } }, [apiConnected, version, isDebug]); var closeScormAPIConnection = (0, _react.useCallback)(function () { if (!apiConnected) return; setSuspendData(); _pipwerksScormApiWrapper.SCORM.status("set", completionStatus); _pipwerksScormApiWrapper.SCORM.save(); if (_pipwerksScormApiWrapper.SCORM.quit()) { setApiConnected(false); setLearnerName("unknown"); setCompletionStatus("unknown"); setSuspendDataState({}); setScormVersion(""); } else { console.error("ScormProvider error: could not close the API connection"); } }, [apiConnected, completionStatus]); var getSuspendData = (0, _react.useCallback)(function () { return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee() { var data; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (apiConnected) { _context.next = 2; break; } throw new Error("SCORM API not connected"); case 2: data = _pipwerksScormApiWrapper.SCORM.get("cmi.suspend_data"); setSuspendDataState(data ? JSON.parse(data) : {}); case 4: case "end": return _context.stop(); } }, _callee); })); }, [apiConnected]); var setSuspendData = (0, _react.useCallback)(function () { if (!apiConnected) return; _pipwerksScormApiWrapper.SCORM.set("cmi.suspend_data", JSON.stringify(suspendData)); }, [apiConnected, suspendData]); var clearSuspendData = (0, _react.useCallback)(function () { return setSuspendDataState({}); }, []); var setStatus = (0, _react.useCallback)(function (status) { if (!apiConnected) return; setCompletionStatus(status); _pipwerksScormApiWrapper.SCORM.status("set", status); }, [apiConnected]); var setScore = (0, _react.useCallback)(function (score) { return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee2() { var saveResult; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: if (apiConnected) { _context2.next = 2; break; } return _context2.abrupt("return", Promise.reject(new Error("SCORM API not connected"))); case 2: _context2.prev = 2; _pipwerksScormApiWrapper.SCORM.set("cmi.score.raw", score.value); if (scormVersion === "2004") { _pipwerksScormApiWrapper.SCORM.set("cmi.score.min", score.min); _pipwerksScormApiWrapper.SCORM.set("cmi.score.max", score.max); } else if (scormVersion === "1.2") { _pipwerksScormApiWrapper.SCORM.set("cmi.core.score.min", score.min); _pipwerksScormApiWrapper.SCORM.set("cmi.core.score.max", score.max); } if (score.status && score.status !== "0") { setStatus(score.status); } saveResult = _pipwerksScormApiWrapper.SCORM.save(); return _context2.abrupt("return", Promise.resolve({ success: true, saveResult: saveResult, score: score })); case 10: _context2.prev = 10; _context2.t0 = _context2["catch"](2); return _context2.abrupt("return", Promise.reject(_context2.t0)); case 13: case "end": return _context2.stop(); } }, _callee2, null, [[2, 10]]); })); }, [apiConnected, scormVersion, setStatus]); var set = (0, _react.useCallback)(function (key, value) { if (!apiConnected) return; _pipwerksScormApiWrapper.SCORM.set(key, value); }, [apiConnected]); var get = (0, _react.useCallback)(function (key) { if (!apiConnected) return null; return _pipwerksScormApiWrapper.SCORM.get(key); }, [apiConnected]); return /*#__PURE__*/_react["default"].createElement(ScoContext.Provider, { value: { apiConnected: apiConnected, learnerName: learnerName, completionStatus: completionStatus, suspendData: suspendData, scormVersion: scormVersion, getSuspendData: getSuspendData, setSuspendData: setSuspendData, clearSuspendData: clearSuspendData, setStatus: setStatus, setScore: setScore, set: set, get: get } }, children); }; var useScorm = exports.useScorm = function useScorm() { var context = _react["default"].useContext(ScoContext); if (!context) { throw new Error("useScorm must be used within a ScormProvider"); } return context; }; var _default = exports["default"] = ScormProvider;