@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
JavaScript
;
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;