@newtonschool/react_proctoring_library 0.0.40 → 0.0.42

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.
@@ -3,12 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- Object.defineProperty(exports, "ActivityTracker", {
7
- enumerable: true,
8
- get: function get() {
9
- return _activityTracker.default;
10
- }
11
- });
12
6
  Object.defineProperty(exports, "FullScreenPermission", {
13
7
  enumerable: true,
14
8
  get: function get() {
@@ -27,7 +21,6 @@ Object.defineProperty(exports, "ProctoredContextApp", {
27
21
  return _Loadable2.default;
28
22
  }
29
23
  });
30
- var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
31
24
  var _permissions = require("./permissions");
32
25
  var _Loadable = _interopRequireDefault(require("./proctor-app/Loadable"));
33
26
  var _Loadable2 = _interopRequireDefault(require("./proctor-context-app/Loadable"));
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.weak-map.js");
3
4
  require("core-js/modules/web.dom-collections.iterator.js");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.weak-map.js");
3
4
  require("core-js/modules/web.dom-collections.iterator.js");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  require("core-js/modules/es.promise.js");
8
+ require("core-js/modules/es.weak-map.js");
8
9
  require("core-js/modules/web.dom-collections.iterator.js");
9
10
  var _react = _interopRequireDefault(require("react"));
10
11
  var _loadable = _interopRequireDefault(require("../../utils/loadable"));
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
 
3
- require("core-js/modules/es.symbol.description.js");
4
3
  require("core-js/modules/es.object.assign.js");
4
+ require("core-js/modules/es.weak-map.js");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = exports.ProctorApp = void 0;
9
- require("core-js/modules/web.dom-collections.iterator.js");
10
9
  require("core-js/modules/es.promise.js");
10
+ require("core-js/modules/web.dom-collections.iterator.js");
11
+ require("core-js/modules/es.symbol.description.js");
11
12
  var _react = _interopRequireWildcard(require("react"));
12
13
  require("./index.scss");
13
14
  var _utils = require("../../utils");
@@ -17,8 +18,10 @@ var _useWebcamData = _interopRequireDefault(require("../../hooks/useWebcamData")
17
18
  var _breachUtils = require("../../utils/breachUtils");
18
19
  var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
19
20
  var _defaults = require("../../constants/defaults");
20
- var _activityTracker = _interopRequireDefault(require("../activity-tracker"));
21
+ var _webcamActivityTracker = _interopRequireDefault(require("../webcam-activity-tracker"));
21
22
  var _browserUtils = require("../../utils/browserUtils");
23
+ var _screenshareActivityTracker = require("../screenshare-activity-tracker");
24
+ var _dom = require("../../constants/dom");
22
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
26
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
27
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -33,7 +36,6 @@ const ProctorApp = _ref => {
33
36
  let {
34
37
  proctoringIdentifier,
35
38
  customPermissionView = null,
36
- shouldRenderChildren = false,
37
39
  permissionPassedProps = {},
38
40
  children,
39
41
  proctoredContext,
@@ -42,27 +44,14 @@ const ProctorApp = _ref => {
42
44
  getWebcamSnapshot = () => {},
43
45
  getScreengrab = () => {}
44
46
  } = _ref;
45
- const [renderChildren, setRenderChildren] = (0, _react.useState)();
46
47
  const context = (0, _react.useContext)(proctoredContext);
47
48
  const {
48
49
  actions,
49
50
  permissions,
50
51
  references,
51
- permissionSetter,
52
- customProps,
53
- customSetter
52
+ permissionSetter
54
53
  } = context;
55
- (0, _react.useEffect)(() => {
56
- if (customProps.childrenRenderer === undefined) {
57
- setRenderChildren(!shouldRenderChildren);
58
- } else {
59
- setRenderChildren(customProps.childrenRenderer);
60
- }
61
- }, [customProps]);
62
54
  const CustomPermissionView = customPermissionView;
63
- const browserDetails = {
64
- isChrome: (0, _browserUtils.isChrome)()
65
- };
66
55
  const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
67
56
  const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
68
57
  const {
@@ -74,20 +63,18 @@ const ProctorApp = _ref => {
74
63
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
75
64
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
76
65
  if (proctorParams.screenshareSnapshots && permissions.screenshare) {
77
- const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
66
+ const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.SCREENSHARE_REFERENCE_ID));
78
67
  getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
79
68
  }
80
69
  }, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots, permissions.screenshare]);
81
- const sendWebcamSnapshot = (0, _react.useCallback)(function () {
70
+ const sendWebcamSnapshot = (0, _react.useCallback)(async function () {
82
71
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
83
72
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
84
73
  if (proctorParams.webcamSnapshots && permissions.video) {
85
- const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
86
- if (references.webcamReference) {
87
- getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
88
- }
74
+ const webcamSnapshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.WEBCAM_REFERENCE_ID));
75
+ getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
89
76
  }
90
- }, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video, references.webcamReference]);
77
+ }, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video]);
91
78
  const sendProctoredParamValues = (0, _react.useCallback)(function () {
92
79
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
93
80
  let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
@@ -123,31 +110,29 @@ const ProctorApp = _ref => {
123
110
  sendScreengrab(true, breachData.breachedParam);
124
111
  }
125
112
  }, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
113
+ const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission);
126
114
  return /*#__PURE__*/_react.default.createElement("div", {
127
115
  className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth fullheight" : "fullwidth fullheight")
128
- }, (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren && children, !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
116
+ }, shouldShowProctoredComponent && children, !shouldShowProctoredComponent && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
129
117
  permissions: permissions,
130
118
  hasAllPermission: actions.hasAllPermission,
131
119
  askPermission: actions.askPermission,
132
120
  references: references,
133
121
  actions: actions,
134
- browserDetails: browserDetails,
135
- renderChildren: () => {
136
- setRenderChildren(true);
137
- customSetter.childrenRenderer(true);
138
- }
139
- }, permissionPassedProps)), !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
122
+ browserDetails: (0, _browserUtils.getBrowserDetails)()
123
+ }, permissionPassedProps)), !shouldShowProctoredComponent && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
140
124
  proctorParams: proctorParams,
141
125
  permissions: permissions,
142
126
  askPermission: actions.askPermission,
143
127
  hasAllPermission: actions.hasAllPermission
144
- }), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
128
+ }), /*#__PURE__*/_react.default.createElement(_webcamActivityTracker.default, {
145
129
  proctorParams: proctorParams,
146
130
  setAudioPermission: permissionSetter.audio,
147
131
  setVideoPermission: permissionSetter.video,
148
132
  webcamReference: references.webcamReference,
149
- canvasReference: references.canvasReference,
150
- screenshareReference: references.screenshareReference
133
+ canvasReference: references.canvasReference
134
+ }), /*#__PURE__*/_react.default.createElement(_screenshareActivityTracker.ScreenshareActivityTracker, {
135
+ ref: references.screenshareReference
151
136
  }));
152
137
  };
153
138
  exports.ProctorApp = ProctorApp;
@@ -10,3 +10,10 @@
10
10
  height: 100%;
11
11
  overflow-y: scroll;
12
12
  }
13
+ .captured-video-canvas {
14
+ position: absolute;
15
+ bottom: 0px;
16
+ }
17
+ .hide {
18
+ visibility: hidden;
19
+ }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  require("core-js/modules/es.promise.js");
8
+ require("core-js/modules/es.weak-map.js");
8
9
  require("core-js/modules/web.dom-collections.iterator.js");
9
10
  var _react = _interopRequireDefault(require("react"));
10
11
  var _loadable = _interopRequireDefault(require("../../utils/loadable"));
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.weak-map.js");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -34,7 +35,6 @@ const ProctoredContextApp = _ref => {
34
35
  const [audioPermisison, setAudioPermission] = (0, _react.useState)();
35
36
  const [videoPermission, setVideoPermission] = (0, _react.useState)();
36
37
  const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
37
- const [customRenderer, setCustomRenderer] = (0, _react.useState)();
38
38
  const webcamReference = (0, _react.useRef)(null);
39
39
  const canvasReference = (0, _react.useRef)(null);
40
40
  const screenshareReference = (0, _react.useRef)(null);
@@ -77,21 +77,15 @@ const ProctoredContextApp = _ref => {
77
77
  video: setVideoPermission,
78
78
  screenshare: setScreensharePermission
79
79
  },
80
- customProps: {
81
- childrenRenderer: customRenderer
82
- },
83
- customSetter: {
84
- childrenRenderer: setCustomRenderer
85
- },
86
80
  proctorParams,
87
81
  actions: {
88
82
  askPermission: askPermission,
89
83
  hasAllPermission: hasAllPermission
90
84
  },
91
85
  references: {
92
- webcamReference: webcamReference,
93
- canvasReference: canvasReference,
94
- screenshareReference: screenshareReference
86
+ webcamReference,
87
+ canvasReference,
88
+ screenshareReference
95
89
  }
96
90
  })
97
91
  }, children);
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.weak-map.js");
4
+ require("core-js/modules/web.dom-collections.iterator.js");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ScreenshareActivityTracker = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _dom = require("../../constants/dom");
11
+ var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ const ScreenshareActivityTracker = /*#__PURE__*/(0, _react.forwardRef)((props, screenshareReference) => {
15
+ (0, _react.useEffect)(() => {
16
+ if (screenshareReference.stream) {
17
+ (0, _webcamMicrophoneUtils.collectScreenshare)(screenshareReference);
18
+ }
19
+ }, []);
20
+ return /*#__PURE__*/_react.default.createElement("video", {
21
+ ref: screenshareReference,
22
+ className: "captured-video-canvas hide",
23
+ id: _dom.SCREENSHARE_REFERENCE_ID
24
+ });
25
+ });
26
+ exports.ScreenshareActivityTracker = ScreenshareActivityTracker;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.weak-map.js");
4
+ require("core-js/modules/web.dom-collections.iterator.js");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactWebcam = _interopRequireDefault(require("react-webcam"));
11
+ var _dom = require("../../constants/dom");
12
+ var _breachUtils = require("../../utils/breachUtils");
13
+ var _browserUtils = require("../../utils/browserUtils");
14
+ var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
+ const WebcamActivityTracker = _ref => {
19
+ let {
20
+ proctorParams,
21
+ setAudioPermission,
22
+ setVideoPermission,
23
+ webcamReference
24
+ } = _ref;
25
+ (0, _react.useEffect)(() => {
26
+ if ((0, _browserUtils.isChrome)()) {
27
+ if ((0, _breachUtils.isWebcamRequired)(proctorParams)) {
28
+ (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
29
+ (0, _webcamMicrophoneUtils.getAudioPermissionQuery)().then(status => {
30
+ status.onchange = evt => {
31
+ (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
32
+ };
33
+ }).catch(err => {
34
+ (0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
35
+ });
36
+ }
37
+ }
38
+ }, [setVideoPermission, setAudioPermission, proctorParams]);
39
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _breachUtils.isWebcamRequired)(proctorParams) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactWebcam.default, {
40
+ audio: true,
41
+ muted: true,
42
+ screenshotFormat: "image/jpeg",
43
+ ref: webcamReference,
44
+ onUserMedia: () => {
45
+ setVideoPermission(true);
46
+ },
47
+ onUserMediaError: () => {
48
+ setVideoPermission(false);
49
+ },
50
+ className: "captured-video-canvas hide",
51
+ id: _dom.WEBCAM_REFERENCE_ID
52
+ })));
53
+ };
54
+ var _default = WebcamActivityTracker;
55
+ exports.default = _default;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.WEBCAM_REFERENCE_ID = exports.SCREENSHARE_REFERENCE_ID = void 0;
7
+ const WEBCAM_REFERENCE_ID = "wc-ref";
8
+ exports.WEBCAM_REFERENCE_ID = WEBCAM_REFERENCE_ID;
9
+ const SCREENSHARE_REFERENCE_ID = "ss-ref";
10
+ exports.SCREENSHARE_REFERENCE_ID = SCREENSHARE_REFERENCE_ID;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = useIsPageFocussed;
7
+ require("core-js/modules/web.dom-collections.iterator.js");
8
+ var _react = require("react");
9
+ var _utils = require("../utils");
10
+ const focusEvent = (0, _utils.getFocusEventName)();
11
+ const blurEvent = (0, _utils.getBlurEventName)();
12
+ function useIsPageFocussed(isProctorParam) {
13
+ const [isFocussed, setIsFocussed] = (0, _react.useState)(true);
14
+ const updateVisibilityOnFocus = () => {
15
+ setIsFocussed(true);
16
+ };
17
+ const updateVisibilityOnBlur = () => {
18
+ setIsFocussed(false);
19
+ };
20
+ (0, _react.useEffect)(() => {
21
+ window.addEventListener(focusEvent, updateVisibilityOnFocus, false);
22
+ window.addEventListener(blurEvent, updateVisibilityOnBlur, false);
23
+ return () => {
24
+ window.removeEventListener(focusEvent, updateVisibilityOnFocus);
25
+ window.removeEventListener(blurEvent, updateVisibilityOnBlur);
26
+ };
27
+ }, []);
28
+ return isFocussed && isProctorParam;
29
+ }
@@ -7,22 +7,17 @@ exports.default = usePageVisibility;
7
7
  require("core-js/modules/web.dom-collections.iterator.js");
8
8
  var _react = require("react");
9
9
  var _utils = require("../utils");
10
- const focusEvent = (0, _utils.getFocusEventName)();
11
- const blurEvent = (0, _utils.getBlurEventName)();
10
+ const visibilityChangeEvent = (0, _utils.getVisibilityChangeEventName)();
12
11
  function usePageVisibility(isProctorParam) {
13
- const [isVisible, setIsVisible] = (0, _react.useState)(true);
14
- const updateVisibilityOnFocus = () => {
15
- setIsVisible(true);
16
- };
17
- const updateVisibilityOnBlur = () => {
18
- setIsVisible(false);
12
+ const [isVisible, setIsVisible] = (0, _react.useState)((0, _utils.getIsDocumentVisible)());
13
+ const updateVisibility = () => {
14
+ setIsVisible((0, _utils.getIsDocumentVisible)());
19
15
  };
20
16
  (0, _react.useEffect)(() => {
21
- window.addEventListener(focusEvent, updateVisibilityOnFocus, false);
22
- window.addEventListener(blurEvent, updateVisibilityOnBlur, false);
17
+ updateVisibility();
18
+ window.addEventListener(visibilityChangeEvent, updateVisibility, false);
23
19
  return () => {
24
- window.removeEventListener(focusEvent, updateVisibilityOnFocus);
25
- window.removeEventListener(blurEvent, updateVisibilityOnBlur);
20
+ window.removeEventListener(visibilityChangeEvent, updateVisibility);
26
21
  };
27
22
  }, []);
28
23
  return isVisible && isProctorParam;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.weak-map.js");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.getFocusEventName = exports.getBrowserFullscreenElementProp = exports.getBlurEventName = void 0;
6
+ exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.getFocusEventName = exports.getBrowserFullscreenElementProp = exports.getBrowserDetails = exports.getBlurEventName = void 0;
7
7
  require("core-js/modules/es.regexp.exec.js");
8
8
  require("core-js/modules/es.string.match.js");
9
9
  const PROPERTY_TYPES = {
@@ -61,4 +61,8 @@ const getBrowserFullscreenElementProp = () => {
61
61
  };
62
62
  exports.getBrowserFullscreenElementProp = getBrowserFullscreenElementProp;
63
63
  const isChrome = () => !!navigator.userAgent.match(/chrome|chromium/i);
64
- exports.isChrome = isChrome;
64
+ exports.isChrome = isChrome;
65
+ const getBrowserDetails = () => ({
66
+ isChrome: isChrome()
67
+ });
68
+ exports.getBrowserDetails = getBrowserDetails;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.weak-map.js");
3
4
  require("core-js/modules/web.dom-collections.iterator.js");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.updateVideoPermissions = exports.updateStatistics = exports.updateAudioPermissions = exports.setupScreensharePermission = exports.isWebcamVideoValid = exports.getVideoPermissionQuery = exports.getVideoPermission = exports.getGlancePercentage = exports.getAudioVideoPermission = exports.getAudioPermissionQuery = exports.getAudioPermission = exports.captureWebcamSnapshot = exports.captureScreenshot = void 0;
6
+ exports.updateVideoPermissions = exports.updateStatistics = exports.updateAudioPermissions = exports.setupScreensharePermission = exports.resetWebcamReference = exports.resetScreenshotReference = exports.isWebcamVideoValid = exports.getVideoPermissionQuery = exports.getVideoPermission = exports.getGlancePercentage = exports.getAudioVideoPermission = exports.getAudioPermissionQuery = exports.getAudioPermission = exports.collectScreenshare = exports.captureWebcamSnapshot = exports.captureScreenshot = void 0;
7
7
  require("core-js/modules/es.array-buffer.slice.js");
8
8
  require("core-js/modules/es.typed-array.uint8-array.js");
9
9
  require("core-js/modules/es.typed-array.fill.js");
@@ -115,10 +115,11 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
115
115
  const track = stream.getTracks()[0];
116
116
  if (track.getSettings().displaySurface === "monitor") {
117
117
  setScreensharePermission(true);
118
- screenshareReference.current = stream;
118
+ screenshareReference.stream = stream;
119
+ collectScreenshare(screenshareReference);
119
120
  track.onended = e => {
120
121
  setScreensharePermission(false);
121
- screenshareReference.current = null;
122
+ screenshareReference.current.srcObject = null;
122
123
  };
123
124
  } else {
124
125
  track.stop();
@@ -126,10 +127,25 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
126
127
  setScreensharePermission(false);
127
128
  }
128
129
  }).catch(e => {
129
- screenshareReference.current = null;
130
+ resetScreenshotReference(screenshareReference);
130
131
  setScreensharePermission(false);
131
132
  });
132
133
  exports.setupScreensharePermission = setupScreensharePermission;
134
+ const collectScreenshare = screenshareReference => {
135
+ screenshareReference.current.srcObject = screenshareReference.stream;
136
+ screenshareReference.current.onloadedmetadata = e => {
137
+ screenshareReference.current.play();
138
+ };
139
+ };
140
+ exports.collectScreenshare = collectScreenshare;
141
+ const resetScreenshotReference = screenshareReference => {
142
+ screenshareReference.current = null;
143
+ };
144
+ exports.resetScreenshotReference = resetScreenshotReference;
145
+ const resetWebcamReference = webcamReference => {
146
+ webcamReference.current = null;
147
+ };
148
+ exports.resetWebcamReference = resetWebcamReference;
133
149
  const getVideoPermissionQuery = () => navigator.permissions.query({
134
150
  name: "camera"
135
151
  });
@@ -158,9 +174,9 @@ const captureWebcamSnapshot = webcamReference => {
158
174
  }
159
175
  };
160
176
  exports.captureWebcamSnapshot = captureWebcamSnapshot;
161
- const captureScreenshot = async () => {
177
+ const captureScreenshot = async elementIdSelector => {
162
178
  try {
163
- const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
179
+ const canvas = await (0, _html2canvas.default)(document.querySelector(elementIdSelector));
164
180
  const b64Snapshot = canvas.toDataURL("image/jpeg");
165
181
  return b64DataURItoBlob(b64Snapshot);
166
182
  } catch (e) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newtonschool/react_proctoring_library",
3
- "version": "0.0.40",
3
+ "version": "0.0.42",
4
4
  "description": "Used to proctor online tests",
5
5
  "author": "ayushkagrawal,shreyachandra,weastel",
6
6
  "main": "dist/index.js",
@@ -1,142 +0,0 @@
1
- "use strict";
2
-
3
- require("core-js/modules/web.dom-collections.iterator.js");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _reactWebcam = _interopRequireDefault(require("react-webcam"));
10
- var _utils = require("../../utils");
11
- var _breachUtils = require("../../utils/breachUtils");
12
- var _browserUtils = require("../../utils/browserUtils");
13
- var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
14
- require("./index.scss");
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
- const ActivityTracker = _ref => {
19
- let {
20
- proctorParams,
21
- webcamReference,
22
- canvasReference,
23
- screenshareReference,
24
- setAudioPermission,
25
- setVideoPermission
26
- } = _ref;
27
- const screenshareVideoReference = (0, _react.useRef)(null);
28
- (0, _react.useEffect)(() => {
29
- if (screenshareReference.current) {
30
- screenshareVideoReference.current.srcObject = screenshareReference.current;
31
- screenshareVideoReference.current.onloadedmetadata = e => {
32
- screenshareVideoReference.current.play();
33
- };
34
- }
35
- return () => {
36
- screenshareVideoReference.current.srcObject = null;
37
- };
38
- }, [screenshareReference.current]);
39
- (0, _react.useEffect)(() => {
40
- if ((0, _browserUtils.isChrome)()) {
41
- if ((0, _breachUtils.isWebcamRequired)(proctorParams)) {
42
- (0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
43
- (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
44
- (0, _webcamMicrophoneUtils.getVideoPermissionQuery)().then(status => {
45
- status.onchange = evt => {
46
- (0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
47
- };
48
- }).catch(err => {});
49
- (0, _webcamMicrophoneUtils.getAudioPermissionQuery)().then(status => {
50
- status.onchange = evt => {
51
- (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
52
- };
53
- }).catch(err => {
54
- (0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
55
- });
56
- }
57
- }
58
- }, [setVideoPermission, setAudioPermission, proctorParams]);
59
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _breachUtils.isWebcamRequired)(proctorParams) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactWebcam.default, {
60
- audio: true,
61
- muted: true,
62
- screenshotFormat: "image/jpeg",
63
- ref: webcamReference,
64
- onUserMedia: stream => {
65
- if (!(0, _browserUtils.isChrome)()) {
66
- const {
67
- audio,
68
- video
69
- } = (0, _utils.getAudioVideoPermission)(stream);
70
- setAudioPermission(audio);
71
- setVideoPermission(video);
72
- stream.onaddtrack = p => {
73
- const {
74
- audio,
75
- video
76
- } = (0, _utils.getAudioVideoPermission)(stream);
77
- setAudioPermission(audio);
78
- setVideoPermission(video);
79
- };
80
- stream.onremovetrack = p => {
81
- const {
82
- audio,
83
- video
84
- } = (0, _utils.getAudioVideoPermission)(stream);
85
- setAudioPermission(audio);
86
- setVideoPermission(video);
87
- };
88
- stream.onactive = p => {
89
- const {
90
- audio,
91
- video
92
- } = (0, _utils.getAudioVideoPermission)(stream);
93
- setAudioPermission(audio);
94
- setVideoPermission(video);
95
- };
96
- stream.oninactive = e => {
97
- setAudioPermission(false);
98
- setVideoPermission(false);
99
- };
100
- const audioTracks = stream.getAudioTracks().filter(track => track.enabled && track.label);
101
- audioTracks.forEach(track => {
102
- track.onended = e => {
103
- const audio = (0, _utils.getAudioPermission)(stream);
104
- setAudioPermission(audio, e.currentTarget.id);
105
- };
106
- track.onmute = e => {
107
- const audio = (0, _utils.getAudioPermission)(stream);
108
- setAudioPermission(audio, e.currentTarget.id);
109
- };
110
- track.onunmute = e => {
111
- const audio = (0, _utils.getAudioPermission)(stream);
112
- setAudioPermission(audio);
113
- };
114
- });
115
- const videoTracks = stream.getVideoTracks().filter(track => track.enabled && track.label);
116
- videoTracks.forEach(track => {
117
- track.onended = e => {
118
- const video = (0, _utils.getVideoPermission)(stream, e.currentTarget.id);
119
- setVideoPermission(video);
120
- };
121
- });
122
- }
123
- },
124
- onUserMediaError: error => {
125
- if (!(0, _browserUtils.isChrome)()) {
126
- setVideoPermission(false);
127
- setAudioPermission(false);
128
- }
129
- },
130
- className: "hide"
131
- }), /*#__PURE__*/_react.default.createElement("canvas", {
132
- ref: canvasReference,
133
- className: "captured-video-canvas hide",
134
- id: "wc-ref"
135
- })), /*#__PURE__*/_react.default.createElement("video", {
136
- ref: screenshareVideoReference,
137
- className: "captured-video-canvas hide",
138
- id: "ss-ref"
139
- }));
140
- };
141
- var _default = ActivityTracker;
142
- exports.default = _default;
@@ -1,7 +0,0 @@
1
- .captured-video-canvas {
2
- position: absolute;
3
- bottom: 0px;
4
- }
5
- .hide {
6
- visibility: hidden;
7
- }