@newtonschool/react_proctoring_library 0.0.43 → 0.0.44

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,14 +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");
5
4
  require("core-js/modules/es.weak-map.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/web.dom-collections.iterator.js");
11
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");
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  require("./index.scss");
14
14
  var _utils = require("../../utils");
@@ -18,8 +18,10 @@ var _useWebcamData = _interopRequireDefault(require("../../hooks/useWebcamData")
18
18
  var _breachUtils = require("../../utils/breachUtils");
19
19
  var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
20
20
  var _defaults = require("../../constants/defaults");
21
- var _activityTracker = _interopRequireDefault(require("../activity-tracker"));
21
+ var _webcamActivityTracker = _interopRequireDefault(require("../webcam-activity-tracker"));
22
22
  var _browserUtils = require("../../utils/browserUtils");
23
+ var _screenshareActivityTracker = require("../screenshare-activity-tracker");
24
+ var _dom = require("../../constants/dom");
23
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
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); }
25
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; }
@@ -34,7 +36,6 @@ const ProctorApp = _ref => {
34
36
  let {
35
37
  proctoringIdentifier,
36
38
  customPermissionView = null,
37
- shouldRenderChildren = false,
38
39
  permissionPassedProps = {},
39
40
  children,
40
41
  proctoredContext,
@@ -43,27 +44,14 @@ const ProctorApp = _ref => {
43
44
  getWebcamSnapshot = () => {},
44
45
  getScreengrab = () => {}
45
46
  } = _ref;
46
- const [renderChildren, setRenderChildren] = (0, _react.useState)();
47
47
  const context = (0, _react.useContext)(proctoredContext);
48
48
  const {
49
49
  actions,
50
50
  permissions,
51
51
  references,
52
- permissionSetter,
53
- customProps,
54
- customSetter
52
+ permissionSetter
55
53
  } = context;
56
- (0, _react.useEffect)(() => {
57
- if (customProps.childrenRenderer === undefined) {
58
- setRenderChildren(!shouldRenderChildren);
59
- } else {
60
- setRenderChildren(customProps.childrenRenderer);
61
- }
62
- }, [customProps]);
63
54
  const CustomPermissionView = customPermissionView;
64
- const browserDetails = {
65
- isChrome: (0, _browserUtils.isChrome)()
66
- };
67
55
  const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
68
56
  const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
69
57
  const {
@@ -75,20 +63,18 @@ const ProctorApp = _ref => {
75
63
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
76
64
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
77
65
  if (proctorParams.screenshareSnapshots && permissions.screenshare) {
78
- const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
66
+ const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.SCREENSHARE_REFERENCE_ID));
79
67
  getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
80
68
  }
81
69
  }, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots, permissions.screenshare]);
82
- const sendWebcamSnapshot = (0, _react.useCallback)(function () {
70
+ const sendWebcamSnapshot = (0, _react.useCallback)(async function () {
83
71
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
84
72
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
85
73
  if (proctorParams.webcamSnapshots && permissions.video) {
86
- const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
87
- if (references.webcamReference) {
88
- getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
89
- }
74
+ const webcamSnapshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.WEBCAM_REFERENCE_ID));
75
+ getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
90
76
  }
91
- }, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video, references.webcamReference]);
77
+ }, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video]);
92
78
  const sendProctoredParamValues = (0, _react.useCallback)(function () {
93
79
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
94
80
  let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
@@ -124,31 +110,29 @@ const ProctorApp = _ref => {
124
110
  sendScreengrab(true, breachData.breachedParam);
125
111
  }
126
112
  }, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
113
+ const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission);
127
114
  return /*#__PURE__*/_react.default.createElement("div", {
128
115
  className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth fullheight" : "fullwidth fullheight")
129
- }, (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({
130
117
  permissions: permissions,
131
118
  hasAllPermission: actions.hasAllPermission,
132
119
  askPermission: actions.askPermission,
133
120
  references: references,
134
121
  actions: actions,
135
- browserDetails: browserDetails,
136
- renderChildren: () => {
137
- setRenderChildren(true);
138
- customSetter.childrenRenderer(true);
139
- }
140
- }, 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, {
141
124
  proctorParams: proctorParams,
142
125
  permissions: permissions,
143
126
  askPermission: actions.askPermission,
144
127
  hasAllPermission: actions.hasAllPermission
145
- }), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
128
+ }), /*#__PURE__*/_react.default.createElement(_webcamActivityTracker.default, {
146
129
  proctorParams: proctorParams,
147
130
  setAudioPermission: permissionSetter.audio,
148
131
  setVideoPermission: permissionSetter.video,
149
132
  webcamReference: references.webcamReference,
150
- canvasReference: references.canvasReference,
151
- screenshareReference: references.screenshareReference
133
+ canvasReference: references.canvasReference
134
+ }), /*#__PURE__*/_react.default.createElement(_screenshareActivityTracker.ScreenshareActivityTracker, {
135
+ ref: references.screenshareReference
152
136
  }));
153
137
  };
154
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
+ }
@@ -35,7 +35,6 @@ const ProctoredContextApp = _ref => {
35
35
  const [audioPermisison, setAudioPermission] = (0, _react.useState)();
36
36
  const [videoPermission, setVideoPermission] = (0, _react.useState)();
37
37
  const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
38
- const [customRenderer, setCustomRenderer] = (0, _react.useState)();
39
38
  const webcamReference = (0, _react.useRef)(null);
40
39
  const canvasReference = (0, _react.useRef)(null);
41
40
  const screenshareReference = (0, _react.useRef)(null);
@@ -78,21 +77,15 @@ const ProctoredContextApp = _ref => {
78
77
  video: setVideoPermission,
79
78
  screenshare: setScreensharePermission
80
79
  },
81
- customProps: {
82
- childrenRenderer: customRenderer
83
- },
84
- customSetter: {
85
- childrenRenderer: setCustomRenderer
86
- },
87
80
  proctorParams,
88
81
  actions: {
89
82
  askPermission: askPermission,
90
83
  hasAllPermission: hasAllPermission
91
84
  },
92
85
  references: {
93
- webcamReference: webcamReference,
94
- canvasReference: canvasReference,
95
- screenshareReference: screenshareReference
86
+ webcamReference,
87
+ canvasReference,
88
+ screenshareReference
96
89
  }
97
90
  })
98
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
+ }
@@ -15,9 +15,9 @@ function usePageVisibility(isProctorParam) {
15
15
  };
16
16
  (0, _react.useEffect)(() => {
17
17
  updateVisibility();
18
- document.addEventListener(visibilityChangeEvent, updateVisibility, false);
18
+ window.addEventListener(visibilityChangeEvent, updateVisibility, false);
19
19
  return () => {
20
- document.removeEventListener(visibilityChangeEvent, updateVisibility);
20
+ window.removeEventListener(visibilityChangeEvent, updateVisibility);
21
21
  };
22
22
  }, []);
23
23
  return isVisible && isProctorParam;
@@ -3,12 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.getBrowserFullscreenElementProp = 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 = {
10
10
  HIDDEN: "hidden",
11
- VISIBILITY_CHANGE: "visibilitychange"
11
+ VISIBILITY_CHANGE: "visibilitychange",
12
+ FOCUS: "focus",
13
+ BLUR: "blur"
12
14
  };
13
15
  const getBrowserPropPrefix = () => {
14
16
  if (typeof document.msHidden !== "undefined") {
@@ -30,6 +32,10 @@ const getBrowserDocumentProp = type => {
30
32
  return getBrowserPropForHidden();
31
33
  case PROPERTY_TYPES.VISIBILITY_CHANGE:
32
34
  return "".concat(getBrowserPropPrefix(), "visibilitychange");
35
+ case PROPERTY_TYPES.FOCUS:
36
+ return "focus";
37
+ case PROPERTY_TYPES.BLUR:
38
+ return "blur";
33
39
  default:
34
40
  return "";
35
41
  }
@@ -38,6 +44,10 @@ const getIsDocumentVisible = () => !document[getBrowserDocumentProp(PROPERTY_TYP
38
44
  exports.getIsDocumentVisible = getIsDocumentVisible;
39
45
  const getVisibilityChangeEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.VISIBILITY_CHANGE);
40
46
  exports.getVisibilityChangeEventName = getVisibilityChangeEventName;
47
+ const getFocusEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.FOCUS);
48
+ exports.getFocusEventName = getFocusEventName;
49
+ const getBlurEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.BLUR);
50
+ exports.getBlurEventName = getBlurEventName;
41
51
  const getBrowserFullscreenElementProp = () => {
42
52
  if (typeof document.fullscreenElement !== "undefined") {
43
53
  return "fullscreenElement";
@@ -51,4 +61,8 @@ const getBrowserFullscreenElementProp = () => {
51
61
  };
52
62
  exports.getBrowserFullscreenElementProp = getBrowserFullscreenElementProp;
53
63
  const isChrome = () => !!navigator.userAgent.match(/chrome|chromium/i);
54
- exports.isChrome = isChrome;
64
+ exports.isChrome = isChrome;
65
+ const getBrowserDetails = () => ({
66
+ isChrome: isChrome()
67
+ });
68
+ exports.getBrowserDetails = getBrowserDetails;
@@ -21,12 +21,24 @@ Object.defineProperty(exports, "getAudioVideoPermission", {
21
21
  return _webcamMicrophoneUtils.getAudioVideoPermission;
22
22
  }
23
23
  });
24
+ Object.defineProperty(exports, "getBlurEventName", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _browserUtils.getBlurEventName;
28
+ }
29
+ });
24
30
  Object.defineProperty(exports, "getBrowserFullscreenElementProp", {
25
31
  enumerable: true,
26
32
  get: function get() {
27
33
  return _browserUtils.getBrowserFullscreenElementProp;
28
34
  }
29
35
  });
36
+ Object.defineProperty(exports, "getFocusEventName", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _browserUtils.getFocusEventName;
40
+ }
41
+ });
30
42
  Object.defineProperty(exports, "getIsDocumentVisible", {
31
43
  enumerable: true,
32
44
  get: function get() {
@@ -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.43",
3
+ "version": "0.0.44",
4
4
  "description": "Used to proctor online tests",
5
5
  "author": "ayushkagrawal,shreyachandra,weastel",
6
6
  "main": "dist/index.js",
@@ -1,143 +0,0 @@
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 _utils = require("../../utils");
12
- var _breachUtils = require("../../utils/breachUtils");
13
- var _browserUtils = require("../../utils/browserUtils");
14
- var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
15
- require("./index.scss");
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
- 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); }
18
- 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; }
19
- const ActivityTracker = _ref => {
20
- let {
21
- proctorParams,
22
- webcamReference,
23
- canvasReference,
24
- screenshareReference,
25
- setAudioPermission,
26
- setVideoPermission
27
- } = _ref;
28
- const screenshareVideoReference = (0, _react.useRef)(null);
29
- (0, _react.useEffect)(() => {
30
- if (screenshareReference.current) {
31
- screenshareVideoReference.current.srcObject = screenshareReference.current;
32
- screenshareVideoReference.current.onloadedmetadata = e => {
33
- screenshareVideoReference.current.play();
34
- };
35
- }
36
- return () => {
37
- screenshareVideoReference.current.srcObject = null;
38
- };
39
- }, [screenshareReference.current]);
40
- (0, _react.useEffect)(() => {
41
- if ((0, _browserUtils.isChrome)()) {
42
- if ((0, _breachUtils.isWebcamRequired)(proctorParams)) {
43
- (0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
44
- (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
45
- (0, _webcamMicrophoneUtils.getVideoPermissionQuery)().then(status => {
46
- status.onchange = evt => {
47
- (0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
48
- };
49
- }).catch(err => {});
50
- (0, _webcamMicrophoneUtils.getAudioPermissionQuery)().then(status => {
51
- status.onchange = evt => {
52
- (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
53
- };
54
- }).catch(err => {
55
- (0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
56
- });
57
- }
58
- }
59
- }, [setVideoPermission, setAudioPermission, proctorParams]);
60
- 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, {
61
- audio: true,
62
- muted: true,
63
- screenshotFormat: "image/jpeg",
64
- ref: webcamReference,
65
- onUserMedia: stream => {
66
- if (!(0, _browserUtils.isChrome)()) {
67
- const {
68
- audio,
69
- video
70
- } = (0, _utils.getAudioVideoPermission)(stream);
71
- setAudioPermission(audio);
72
- setVideoPermission(video);
73
- stream.onaddtrack = p => {
74
- const {
75
- audio,
76
- video
77
- } = (0, _utils.getAudioVideoPermission)(stream);
78
- setAudioPermission(audio);
79
- setVideoPermission(video);
80
- };
81
- stream.onremovetrack = p => {
82
- const {
83
- audio,
84
- video
85
- } = (0, _utils.getAudioVideoPermission)(stream);
86
- setAudioPermission(audio);
87
- setVideoPermission(video);
88
- };
89
- stream.onactive = p => {
90
- const {
91
- audio,
92
- video
93
- } = (0, _utils.getAudioVideoPermission)(stream);
94
- setAudioPermission(audio);
95
- setVideoPermission(video);
96
- };
97
- stream.oninactive = e => {
98
- setAudioPermission(false);
99
- setVideoPermission(false);
100
- };
101
- const audioTracks = stream.getAudioTracks().filter(track => track.enabled && track.label);
102
- audioTracks.forEach(track => {
103
- track.onended = e => {
104
- const audio = (0, _utils.getAudioPermission)(stream);
105
- setAudioPermission(audio, e.currentTarget.id);
106
- };
107
- track.onmute = e => {
108
- const audio = (0, _utils.getAudioPermission)(stream);
109
- setAudioPermission(audio, e.currentTarget.id);
110
- };
111
- track.onunmute = e => {
112
- const audio = (0, _utils.getAudioPermission)(stream);
113
- setAudioPermission(audio);
114
- };
115
- });
116
- const videoTracks = stream.getVideoTracks().filter(track => track.enabled && track.label);
117
- videoTracks.forEach(track => {
118
- track.onended = e => {
119
- const video = (0, _utils.getVideoPermission)(stream, e.currentTarget.id);
120
- setVideoPermission(video);
121
- };
122
- });
123
- }
124
- },
125
- onUserMediaError: error => {
126
- if (!(0, _browserUtils.isChrome)()) {
127
- setVideoPermission(false);
128
- setAudioPermission(false);
129
- }
130
- },
131
- className: "hide"
132
- }), /*#__PURE__*/_react.default.createElement("canvas", {
133
- ref: canvasReference,
134
- className: "captured-video-canvas hide",
135
- id: "wc-ref"
136
- })), /*#__PURE__*/_react.default.createElement("video", {
137
- ref: screenshareVideoReference,
138
- className: "captured-video-canvas hide",
139
- id: "ss-ref"
140
- }));
141
- };
142
- var _default = ActivityTracker;
143
- exports.default = _default;
@@ -1,7 +0,0 @@
1
- .captured-video-canvas {
2
- position: absolute;
3
- bottom: 0px;
4
- }
5
- .hide {
6
- visibility: hidden;
7
- }