@newtonschool/react_proctoring_library 0.0.66 → 0.0.68-staging
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/breach-parameters/index.js +24 -0
- package/dist/components/fullscreen/index.js +38 -0
- package/dist/components/index.js +1 -1
- package/dist/components/permissions/index.js +31 -20
- package/dist/components/permissions/permission-body.js +49 -26
- package/dist/components/proctor-app/Loadable.js +3 -2
- package/dist/components/proctor-app/index.js +68 -106
- package/dist/components/proctor-context-app/Loadable.js +3 -2
- package/dist/components/proctor-context-app/index.js +45 -31
- package/dist/components/screenshare-activity-tracker/electron.js +107 -0
- package/dist/components/screenshare-activity-tracker/index.js +31 -15
- package/dist/components/screenshare-activity-tracker/web.js +95 -0
- package/dist/components/webcam-activity-tracker/electron.js +131 -0
- package/dist/components/webcam-activity-tracker/index.js +32 -49
- package/dist/components/webcam-activity-tracker/web.js +128 -0
- package/dist/contexts/ElectronContext.js +9 -0
- package/dist/hooks/electron/useFullScreenData.js +40 -0
- package/dist/hooks/electron/useIsElectron.js +31 -0
- package/dist/hooks/electron/useIsPageFocussed.js +25 -0
- package/dist/hooks/electron/useKishokMode.js +43 -0
- package/dist/hooks/electron/usePageVisibility.js +37 -0
- package/dist/hooks/electron/useWakeUpLock.js +33 -0
- package/dist/hooks/useBreachData.js +39 -0
- package/dist/hooks/useGenericFullScreenData.js +29 -0
- package/dist/hooks/useGenericPageFocus.js +17 -0
- package/dist/hooks/useGenericPageVisibility.js +17 -0
- package/dist/hooks/useGenericWakeUpLock.js +29 -0
- package/dist/hooks/useTrackBreachParameters.js +63 -0
- package/dist/hooks/{index.js → web/index.js} +1 -1
- package/dist/hooks/{useFullScreenData.js → web/useFullScreenData.js} +12 -10
- package/dist/hooks/{useIsPageFocussed.js → web/useIsPageFocussed.js} +1 -1
- package/dist/hooks/{usePageVisibility.js → web/usePageVisibility.js} +1 -1
- package/dist/hooks/{useWakeUpLock.js → web/useWakeUpLock.js} +2 -2
- package/dist/index.js +9 -1
- package/dist/utils/breachUtils.js +1 -1
- package/dist/utils/browserUtils.js +31 -22
- package/dist/utils/fullScreen.js +31 -0
- package/dist/utils/gpuUtils.js +6 -3
- package/dist/utils/loadable.js +11 -3
- package/dist/utils/webcamMicrophoneUtils.js +27 -4
- package/package.json +3 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = BreachParameters;
|
|
7
|
+
var _useTrackBreachParameters = require("../../hooks/useTrackBreachParameters");
|
|
8
|
+
function BreachParameters(_ref) {
|
|
9
|
+
let {
|
|
10
|
+
config,
|
|
11
|
+
getProctorParamValues,
|
|
12
|
+
proctoringIdentifier,
|
|
13
|
+
permissions,
|
|
14
|
+
proctorParams
|
|
15
|
+
} = _ref;
|
|
16
|
+
(0, _useTrackBreachParameters.useTrackBreachParameters)({
|
|
17
|
+
config,
|
|
18
|
+
getProctorParamValues,
|
|
19
|
+
proctoringIdentifier,
|
|
20
|
+
permissions,
|
|
21
|
+
proctorParams
|
|
22
|
+
});
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = FullScreen;
|
|
7
|
+
require("core-js/modules/es.symbol.description.js");
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
var _useGenericFullScreenData = _interopRequireDefault(require("../../hooks/useGenericFullScreenData"));
|
|
10
|
+
var _ElectronContext = require("../../contexts/ElectronContext");
|
|
11
|
+
var _useKishokMode = _interopRequireDefault(require("../../hooks/electron/useKishokMode"));
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
15
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
16
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
17
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
18
|
+
function FullScreen(_ref) {
|
|
19
|
+
let {
|
|
20
|
+
setAskPermissionAction,
|
|
21
|
+
proctoredContext,
|
|
22
|
+
proctorParams
|
|
23
|
+
} = _ref;
|
|
24
|
+
const isElectronApp = (0, _react.useContext)(_ElectronContext.ElectronContext);
|
|
25
|
+
const {
|
|
26
|
+
setFullscreen
|
|
27
|
+
} = (0, _useGenericFullScreenData.default)(isElectronApp);
|
|
28
|
+
(0, _useKishokMode.default)({
|
|
29
|
+
proctoredContext,
|
|
30
|
+
proctorParams
|
|
31
|
+
});
|
|
32
|
+
(0, _react.useEffect)(() => {
|
|
33
|
+
setAskPermissionAction(oldAskPermissionAction => _objectSpread(_objectSpread({}, oldAskPermissionAction), {}, {
|
|
34
|
+
fullscreen: () => setFullscreen(true)
|
|
35
|
+
}));
|
|
36
|
+
}, [setAskPermissionAction, setFullscreen]);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
package/dist/components/index.js
CHANGED
|
@@ -24,4 +24,4 @@ Object.defineProperty(exports, "ProctoredContextApp", {
|
|
|
24
24
|
var _permissions = require("./permissions");
|
|
25
25
|
var _proctorApp = _interopRequireDefault(require("./proctor-app"));
|
|
26
26
|
var _proctorContextApp = _interopRequireDefault(require("./proctor-context-app"));
|
|
27
|
-
function _interopRequireDefault(
|
|
27
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -13,9 +13,10 @@ var text = _interopRequireWildcard(require("../../constants/text"));
|
|
|
13
13
|
var _permissionBody = require("./permission-body");
|
|
14
14
|
var _breachUtils = require("../../utils/breachUtils");
|
|
15
15
|
var _permission = require("../../utils/permission");
|
|
16
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
17
|
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); }
|
|
17
18
|
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; }
|
|
18
|
-
function _interopRequireDefault(
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
20
|
const Permission = _ref => {
|
|
20
21
|
let {
|
|
21
22
|
proctorParams,
|
|
@@ -23,28 +24,38 @@ const Permission = _ref => {
|
|
|
23
24
|
askPermission
|
|
24
25
|
} = _ref;
|
|
25
26
|
const showPermissionModal = !(0, _permission.hasAllPermissions)((0, _breachUtils.getRequiredPermissionsFromProctorParams)(proctorParams), permissions);
|
|
26
|
-
return /*#__PURE__*/
|
|
27
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Modal, {
|
|
27
28
|
show: showPermissionModal,
|
|
28
29
|
size: "lg",
|
|
29
30
|
backdrop: "static",
|
|
30
31
|
"aria-labelledby": "contained-modal-title-vcenter",
|
|
31
|
-
centered: true
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
centered: true,
|
|
33
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Modal.Header, {
|
|
34
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Modal.Title, {
|
|
35
|
+
children: text.PERMISSION_TITLE
|
|
36
|
+
})
|
|
37
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Modal.Body, {
|
|
38
|
+
className: "font-medium",
|
|
39
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_permissionBody.PermissionBody, {
|
|
40
|
+
showFullscreenText: !permissions.fullscreen && proctorParams.fullscreenExit,
|
|
41
|
+
showAudioPermissionText: !permissions.audio && (0, _breachUtils.isAudioRequired)(proctorParams),
|
|
42
|
+
showVideoPermissionText: !permissions.video && (0, _breachUtils.isWebcamRequired)(proctorParams),
|
|
43
|
+
showScreensharePermission: !permissions.screenshare && proctorParams.screenshareSnapshots
|
|
44
|
+
})
|
|
45
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Modal.Footer, {
|
|
46
|
+
children: [!permissions.screenshare && proctorParams.screenshareSnapshots && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
47
|
+
onClick: () => {
|
|
48
|
+
askPermission(['screenshare']);
|
|
49
|
+
},
|
|
50
|
+
children: text.ALLOW_SCREENSHARE
|
|
51
|
+
}), !permissions.fullscreen && proctorParams.fullscreenExit && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
52
|
+
variant: "primary",
|
|
53
|
+
onClick: () => {
|
|
54
|
+
askPermission(['fullscreen']);
|
|
55
|
+
},
|
|
56
|
+
children: text.ALLOW_FULLSCREEN
|
|
57
|
+
})]
|
|
58
|
+
})]
|
|
59
|
+
});
|
|
49
60
|
};
|
|
50
61
|
exports.Permission = Permission;
|
|
@@ -11,9 +11,10 @@ var _urlVideoPermissionHighlight = _interopRequireDefault(require("../../assets/
|
|
|
11
11
|
require("./index.scss");
|
|
12
12
|
var text = _interopRequireWildcard(require("../../constants/text"));
|
|
13
13
|
var _browserUtils = require("../../utils/browserUtils");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
15
|
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); }
|
|
15
16
|
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; }
|
|
16
|
-
function _interopRequireDefault(
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
18
|
const PermissionBody = _ref => {
|
|
18
19
|
let {
|
|
19
20
|
showFullscreenText,
|
|
@@ -21,30 +22,52 @@ const PermissionBody = _ref => {
|
|
|
21
22
|
showVideoPermissionText,
|
|
22
23
|
showScreensharePermission
|
|
23
24
|
} = _ref;
|
|
24
|
-
return /*#__PURE__*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
25
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
26
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
27
|
+
className: "mb-2",
|
|
28
|
+
children: text.PERMISSION_GENERIC
|
|
29
|
+
}), showScreensharePermission && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
30
|
+
className: "mb-2",
|
|
31
|
+
children: [!(0, _browserUtils.isChrome)() && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
32
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
|
|
33
|
+
children: "Please switch to chrome"
|
|
34
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {})]
|
|
35
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
36
|
+
className: "pr-2 font-weight-bold",
|
|
37
|
+
children: "Screenshare:"
|
|
38
|
+
}), text.PERMISSION_SCREENSHARE]
|
|
39
|
+
}), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
40
|
+
className: "mb-2",
|
|
41
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
42
|
+
className: "pr-2 font-weight-bold",
|
|
43
|
+
children: "Camera/Microphone:"
|
|
44
|
+
}), text.PERMISSION_AUDIO_VIDEO]
|
|
45
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
46
|
+
children: [showVideoPermissionText && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
47
|
+
className: "mb-2",
|
|
48
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
49
|
+
className: "pr-2 font-weight-bold",
|
|
50
|
+
children: "Camera:"
|
|
51
|
+
}), text.PERMISSION_VIDEO]
|
|
52
|
+
}), showAudioPermissionText && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
53
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
54
|
+
className: "pr-2 font-weight-bold",
|
|
55
|
+
children: "Microphone:"
|
|
56
|
+
}), text.PERMISSION_AUDIO]
|
|
57
|
+
})]
|
|
58
|
+
}), (showAudioPermissionText || showVideoPermissionText) && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
59
|
+
className: "d-flex justify-content-center",
|
|
60
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
|
|
61
|
+
className: "video-permission-img",
|
|
62
|
+
alt: "url_video_permission_highlight",
|
|
63
|
+
src: _urlVideoPermissionHighlight.default
|
|
64
|
+
})
|
|
65
|
+
}), showFullscreenText && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
66
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
67
|
+
className: "pr-2 font-weight-bold",
|
|
68
|
+
children: "Fullscreen:"
|
|
69
|
+
}), text.PERMISSION_FULLSCREEN]
|
|
70
|
+
})]
|
|
71
|
+
});
|
|
49
72
|
};
|
|
50
73
|
exports.PermissionBody = PermissionBody;
|
|
@@ -9,11 +9,12 @@ require("core-js/modules/es.weak-map.js");
|
|
|
9
9
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
10
10
|
var _react = _interopRequireDefault(require("react"));
|
|
11
11
|
var _loadable = _interopRequireDefault(require("../../utils/loadable"));
|
|
12
|
-
|
|
12
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
14
|
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); }
|
|
14
15
|
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; } /**
|
|
15
16
|
* Asynchronously loads the component for FeaturePage
|
|
16
17
|
*/
|
|
17
18
|
var _default = exports.default = (0, _loadable.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require("./index"))), {
|
|
18
|
-
fallback: /*#__PURE__*/
|
|
19
|
+
fallback: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {})
|
|
19
20
|
});
|
|
@@ -1,38 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/es.
|
|
3
|
+
require("core-js/modules/es.symbol.description.js");
|
|
4
4
|
require("core-js/modules/es.weak-map.js");
|
|
5
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
6
5
|
Object.defineProperty(exports, "__esModule", {
|
|
7
6
|
value: true
|
|
8
7
|
});
|
|
9
8
|
exports.default = exports.ProctorApp = void 0;
|
|
10
|
-
require("core-js/modules/
|
|
11
|
-
require("core-js/modules/es.symbol.description.js");
|
|
9
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
12
10
|
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
-
var _useWakeUpLock = require("../../hooks/useWakeUpLock");
|
|
14
11
|
require("./index.scss");
|
|
15
|
-
var _utils = require("../../utils");
|
|
16
|
-
var _hooks = require("../../hooks");
|
|
17
12
|
var _permissions = require("../permissions");
|
|
18
13
|
var _breachUtils = require("../../utils/breachUtils");
|
|
19
|
-
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
20
14
|
var _defaults = require("../../constants/defaults");
|
|
21
|
-
var _webcamActivityTracker = _interopRequireDefault(require("../webcam-activity-tracker"));
|
|
22
15
|
var _browserUtils = require("../../utils/browserUtils");
|
|
23
|
-
var _screenshareActivityTracker = require("../screenshare-activity-tracker");
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
|
|
16
|
+
var _screenshareActivityTracker = _interopRequireDefault(require("../screenshare-activity-tracker"));
|
|
17
|
+
var _webcamActivityTracker = _interopRequireDefault(require("../webcam-activity-tracker"));
|
|
18
|
+
var _fullscreen = _interopRequireDefault(require("../fullscreen"));
|
|
19
|
+
var _ElectronContext = require("../../contexts/ElectronContext");
|
|
20
|
+
var _useGenericWakeUpLock = _interopRequireDefault(require("../../hooks/useGenericWakeUpLock"));
|
|
21
|
+
var _breachParameters = _interopRequireDefault(require("../breach-parameters"));
|
|
22
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
23
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
27
24
|
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); }
|
|
28
25
|
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; }
|
|
29
|
-
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
30
26
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
31
27
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
32
|
-
function _defineProperty(
|
|
28
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
33
29
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
34
30
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
35
|
-
const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
|
|
36
31
|
const ProctorApp = _ref => {
|
|
37
32
|
let {
|
|
38
33
|
proctoringIdentifier,
|
|
@@ -48,109 +43,76 @@ const ProctorApp = _ref => {
|
|
|
48
43
|
} = _ref;
|
|
49
44
|
const context = (0, _react.useContext)(proctoredContext);
|
|
50
45
|
const {
|
|
51
|
-
actions,
|
|
52
46
|
permissions,
|
|
53
47
|
references,
|
|
54
|
-
|
|
55
|
-
screenshareStream
|
|
48
|
+
permissionErrors
|
|
56
49
|
} = context;
|
|
57
50
|
const {
|
|
58
51
|
acquireWakeUpLock,
|
|
59
52
|
releaseWakeUpLock
|
|
60
|
-
} = (0,
|
|
53
|
+
} = (0, _useGenericWakeUpLock.default)();
|
|
54
|
+
const [askPermissionAction, setAskPermissionAction] = (0, _react.useState)({
|
|
55
|
+
screenshare: () => {},
|
|
56
|
+
fullscreen: () => {},
|
|
57
|
+
video: () => {}
|
|
58
|
+
});
|
|
61
59
|
(0, _react.useEffect)(() => {
|
|
62
60
|
acquireWakeUpLock();
|
|
63
61
|
return releaseWakeUpLock;
|
|
64
62
|
}, []);
|
|
63
|
+
const isElectronApp = (0, _react.useContext)(_ElectronContext.ElectronContext);
|
|
65
64
|
const CustomPermissionView = customPermissionView;
|
|
66
65
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
67
|
-
const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
|
|
68
|
-
const {
|
|
69
|
-
recurring = false,
|
|
70
|
-
recurringFetchInterval = 0
|
|
71
|
-
} = config;
|
|
72
|
-
const recurringFetchIntervalRef = (0, _react.useRef)(null);
|
|
73
|
-
const sendScreengrab = (0, _react.useCallback)(async function () {
|
|
74
|
-
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
75
|
-
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
76
|
-
if (proctorParams.screenshareSnapshots && permissions.screenshare) {
|
|
77
|
-
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.SCREENSHARE_REFERENCE_ID));
|
|
78
|
-
getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
|
|
79
|
-
}
|
|
80
|
-
}, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots, permissions.screenshare]);
|
|
81
|
-
const sendWebcamSnapshot = (0, _react.useCallback)(async function () {
|
|
82
|
-
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
83
|
-
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
84
|
-
if (proctorParams.webcamSnapshots && permissions.video) {
|
|
85
|
-
const webcamSnapshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.WEBCAM_REFERENCE_ID));
|
|
86
|
-
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
87
|
-
}
|
|
88
|
-
}, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video]);
|
|
89
|
-
const sendProctoredParamValues = (0, _react.useCallback)(function () {
|
|
90
|
-
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
91
|
-
let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
92
|
-
getProctorParamValues(proctoringIdentifier, statistics.current, isBreach, breachParam);
|
|
93
|
-
}, [proctoringIdentifier, getProctorParamValues]);
|
|
94
|
-
const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch);
|
|
95
|
-
const isPageFocussed = (0, _useIsPageFocussed.default)(proctorParams.pageFocus);
|
|
96
|
-
(0, _react.useEffect)(() => {
|
|
97
|
-
let timeoutId = null;
|
|
98
|
-
if (recurring) {
|
|
99
|
-
const randomStartDelay = 1000 * (Math.floor(Math.random() * 10) + 1);
|
|
100
|
-
timeoutId = setTimeout(() => {
|
|
101
|
-
sendWebcamSnapshot();
|
|
102
|
-
sendScreengrab();
|
|
103
|
-
recurringFetchIntervalRef.current = setInterval(() => {
|
|
104
|
-
sendProctoredParamValues();
|
|
105
|
-
sendWebcamSnapshot();
|
|
106
|
-
sendScreengrab();
|
|
107
|
-
}, recurringFetchInterval);
|
|
108
|
-
}, randomStartDelay);
|
|
109
|
-
}
|
|
110
|
-
return () => {
|
|
111
|
-
clearInterval(recurringFetchIntervalRef.current);
|
|
112
|
-
clearTimeout(timeoutId);
|
|
113
|
-
};
|
|
114
|
-
}, [recurring, recurringFetchInterval, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab]);
|
|
115
|
-
(0, _react.useEffect)(() => {
|
|
116
|
-
const currentStats = {
|
|
117
|
-
isTabSwitched,
|
|
118
|
-
isFullScreen: permissions.fullscreen,
|
|
119
|
-
isWebcamDataNotReliable: !isWebcamProcessingReliable,
|
|
120
|
-
isPageFocussed
|
|
121
|
-
};
|
|
122
|
-
const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats, proctorParams);
|
|
123
|
-
(0, _utils.updateStatistics)(statistics, currentStats, proctorParams);
|
|
124
|
-
if (breachData) {
|
|
125
|
-
sendProctoredParamValues(true, breachData.breachedParam);
|
|
126
|
-
sendWebcamSnapshot(true, breachData.breachedParam);
|
|
127
|
-
sendScreengrab(true, breachData.breachedParam);
|
|
128
|
-
}
|
|
129
|
-
}, [isTabSwitched, isPageFocussed, permissions.fullscreen, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
|
|
130
66
|
const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, permissions);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
67
|
+
const askPermission = (0, _react.useCallback)(requiredPermissions => {
|
|
68
|
+
requiredPermissions.forEach(element => {
|
|
69
|
+
if (!permissions[element] && askPermissionAction[element]) {
|
|
70
|
+
askPermissionAction[element]();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}, [permissions, askPermissionAction]);
|
|
74
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
75
|
+
className: "".concat(proctorParams.copyPasteProctoring ? 'disable-copy-paste fullwidth fullheight' : 'fullwidth fullheight'),
|
|
76
|
+
children: [shouldShowProctoredComponent && children, !shouldShowProctoredComponent && customPermissionView && /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomPermissionView, _objectSpread({
|
|
77
|
+
permissions: permissions,
|
|
78
|
+
proctorParams: proctorParams,
|
|
79
|
+
references: references,
|
|
80
|
+
actions: {
|
|
81
|
+
askPermission
|
|
82
|
+
},
|
|
83
|
+
browserDetails: (0, _browserUtils.getBrowserDetails)(),
|
|
84
|
+
permissionErrors: permissionErrors
|
|
85
|
+
}, permissionPassedProps)), !shouldShowProctoredComponent && !customPermissionView && /*#__PURE__*/(0, _jsxRuntime.jsx)(_permissions.Permission, {
|
|
86
|
+
permissions: permissions,
|
|
87
|
+
proctorParams: proctorParams,
|
|
88
|
+
askPermission: askPermission
|
|
89
|
+
}), proctorParams.webcamSnapshots && /*#__PURE__*/(0, _jsxRuntime.jsx)(_webcamActivityTracker.default, {
|
|
90
|
+
logger: logger,
|
|
91
|
+
config: config,
|
|
92
|
+
proctorParams: proctorParams,
|
|
93
|
+
proctoredContext: proctoredContext,
|
|
94
|
+
getWebcamSnapshot: getWebcamSnapshot,
|
|
95
|
+
proctoringIdentifier: proctoringIdentifier,
|
|
96
|
+
setAskPermissionAction: setAskPermissionAction
|
|
97
|
+
}), proctorParams.screenshareSnapshots && /*#__PURE__*/(0, _jsxRuntime.jsx)(_screenshareActivityTracker.default, {
|
|
98
|
+
config: config,
|
|
99
|
+
getScreengrab: getScreengrab,
|
|
100
|
+
proctorParams: proctorParams,
|
|
101
|
+
proctoredContext: proctoredContext,
|
|
102
|
+
proctoringIdentifier: proctoringIdentifier,
|
|
103
|
+
setAskPermissionAction: setAskPermissionAction
|
|
104
|
+
}), proctorParams.fullscreenExit && /*#__PURE__*/(0, _jsxRuntime.jsx)(_fullscreen.default, {
|
|
105
|
+
setAskPermissionAction: setAskPermissionAction,
|
|
106
|
+
proctorParams: proctorParams,
|
|
107
|
+
proctoredContext: proctoredContext
|
|
108
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_breachParameters.default, {
|
|
109
|
+
config: config,
|
|
110
|
+
getProctorParamValues: getProctorParamValues,
|
|
111
|
+
permissions: permissions,
|
|
112
|
+
proctorParams: proctorParams,
|
|
113
|
+
proctoringIdentifier: proctoringIdentifier
|
|
114
|
+
})]
|
|
115
|
+
});
|
|
154
116
|
};
|
|
155
117
|
exports.ProctorApp = ProctorApp;
|
|
156
118
|
var _default = exports.default = ProctorApp;
|
|
@@ -9,11 +9,12 @@ require("core-js/modules/es.weak-map.js");
|
|
|
9
9
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
10
10
|
var _react = _interopRequireDefault(require("react"));
|
|
11
11
|
var _loadable = _interopRequireDefault(require("../../utils/loadable"));
|
|
12
|
-
|
|
12
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
14
|
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); }
|
|
14
15
|
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; } /**
|
|
15
16
|
* Asynchronously loads the component for FeaturePage
|
|
16
17
|
*/
|
|
17
18
|
var _default = exports.default = (0, _loadable.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require("./index"))), {
|
|
18
|
-
fallback: /*#__PURE__*/
|
|
19
|
+
fallback: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {})
|
|
19
20
|
});
|
|
@@ -8,14 +8,17 @@ exports.default = void 0;
|
|
|
8
8
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
9
9
|
require("core-js/modules/es.symbol.description.js");
|
|
10
10
|
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
-
var _hooks = require("../../hooks");
|
|
12
|
-
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
13
11
|
var _defaults = require("../../constants/defaults");
|
|
12
|
+
var _useIsElectron = _interopRequireDefault(require("../../hooks/electron/useIsElectron"));
|
|
13
|
+
var _ElectronContext = require("../../contexts/ElectronContext");
|
|
14
|
+
var _useGenericFullScreenData = _interopRequireDefault(require("../../hooks/useGenericFullScreenData"));
|
|
15
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
17
|
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); }
|
|
15
18
|
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; }
|
|
16
19
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
20
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
18
|
-
function _defineProperty(
|
|
21
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
19
22
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
20
23
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
21
24
|
const ProctoredContextApp = _ref => {
|
|
@@ -28,17 +31,25 @@ const ProctoredContextApp = _ref => {
|
|
|
28
31
|
customContext = {}
|
|
29
32
|
} = _ref;
|
|
30
33
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
} = (0, _hooks.useFullscreenData)(proctorParams.fullscreenExit);
|
|
34
|
+
const [, isElectronApp] = (0, _useIsElectron.default)();
|
|
35
|
+
const [webCamDeviceId, setWebCamDeviceId] = (0, _react.useState)();
|
|
36
|
+
const [screenShareDeviceId, setScreenShareDeviceId] = (0, _react.useState)();
|
|
35
37
|
const [audioPermisison, setAudioPermission] = (0, _react.useState)();
|
|
36
38
|
const [videoPermission, setVideoPermission] = (0, _react.useState)();
|
|
39
|
+
const [permissionErrors, setPermissionErrors] = (0, _react.useState)({
|
|
40
|
+
audio: null,
|
|
41
|
+
video: null,
|
|
42
|
+
fullscreen: null,
|
|
43
|
+
screenshare: null
|
|
44
|
+
});
|
|
37
45
|
const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
|
|
38
46
|
const webcamReference = (0, _react.useRef)(null);
|
|
39
|
-
const canvasReference = (0, _react.useRef)(null);
|
|
40
47
|
const screenshareReference = (0, _react.useRef)(null);
|
|
41
48
|
const [screenshareStream, setScreenshareStream] = (0, _react.useState)(null);
|
|
49
|
+
const data = (0, _useGenericFullScreenData.default)(isElectronApp);
|
|
50
|
+
const {
|
|
51
|
+
isFullscreen
|
|
52
|
+
} = data;
|
|
42
53
|
const Context = contextProvider;
|
|
43
54
|
const permissions = (0, _react.useMemo)(() => ({
|
|
44
55
|
video: videoPermission,
|
|
@@ -46,25 +57,17 @@ const ProctoredContextApp = _ref => {
|
|
|
46
57
|
fullscreen: isFullscreen,
|
|
47
58
|
screenshare: screensharePermission
|
|
48
59
|
}), [videoPermission, audioPermisison, isFullscreen, screensharePermission]);
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
},
|
|
53
|
-
fullscreen: () => {
|
|
54
|
-
setFullscreen();
|
|
55
|
-
},
|
|
56
|
-
video: () => {
|
|
57
|
-
window.location.reload();
|
|
60
|
+
const endTest = () => {
|
|
61
|
+
if (isElectronApp) {
|
|
62
|
+
window.electron.actions.stopProctoring();
|
|
58
63
|
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}, [permissions, askPermissionAction]);
|
|
67
|
-
return /*#__PURE__*/_react.default.createElement(Context.Provider, {
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// useEffect(()=>{
|
|
67
|
+
// endTest
|
|
68
|
+
// })
|
|
69
|
+
|
|
70
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Context.Provider, {
|
|
68
71
|
value: _objectSpread(_objectSpread({}, customContext), {}, {
|
|
69
72
|
permissions,
|
|
70
73
|
permissionSetter: {
|
|
@@ -72,17 +75,28 @@ const ProctoredContextApp = _ref => {
|
|
|
72
75
|
video: setVideoPermission,
|
|
73
76
|
screenshare: setScreensharePermission
|
|
74
77
|
},
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
askPermission
|
|
78
|
+
streamSetter: {
|
|
79
|
+
screenshare: setScreenshareStream
|
|
78
80
|
},
|
|
81
|
+
device: {
|
|
82
|
+
webCamDeviceId,
|
|
83
|
+
screenShareDeviceId,
|
|
84
|
+
setWebCamDeviceId,
|
|
85
|
+
setScreenShareDeviceId
|
|
86
|
+
},
|
|
87
|
+
permissionErrors,
|
|
88
|
+
setPermissionErrors,
|
|
89
|
+
proctorParams,
|
|
79
90
|
references: {
|
|
80
91
|
webcamReference,
|
|
81
|
-
canvasReference,
|
|
82
92
|
screenshareReference
|
|
83
93
|
},
|
|
84
94
|
screenshareStream
|
|
95
|
+
}),
|
|
96
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ElectronContext.ElectronContextProvider, {
|
|
97
|
+
value: isElectronApp,
|
|
98
|
+
children: children
|
|
85
99
|
})
|
|
86
|
-
}
|
|
100
|
+
});
|
|
87
101
|
};
|
|
88
102
|
var _default = exports.default = ProctoredContextApp;
|