@newtonschool/react_proctoring_library 0.0.17 → 0.0.20

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.
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.object.assign.js");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
@@ -11,7 +13,7 @@ require("core-js/modules/es.promise.js");
11
13
 
12
14
  var _react = _interopRequireWildcard(require("react"));
13
15
 
14
- var _ = require(".");
16
+ require("./index.scss");
15
17
 
16
18
  var _utils = require("../utils");
17
19
 
@@ -27,12 +29,18 @@ var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
27
29
 
28
30
  var _defaults = require("../constants/defaults");
29
31
 
32
+ var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
33
+
34
+ var _browserUtils = require("../utils/browserUtils");
35
+
30
36
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
37
 
32
38
  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); }
33
39
 
34
40
  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; }
35
41
 
42
+ 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); }
43
+
36
44
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
45
 
38
46
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -44,25 +52,43 @@ const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
44
52
  const ProctorApp = _ref => {
45
53
  let {
46
54
  proctoringIdentifier,
55
+ customPermissionView = null,
56
+ shouldRenderChildren = false,
57
+ permissionPassedProps = {},
47
58
  children,
59
+ proctoredContext,
48
60
  config,
49
61
  getProctorParamValues = () => {},
50
62
  getWebcamSnapshot = () => {},
51
63
  getScreengrab = () => {}
52
64
  } = _ref;
53
- const webcamReference = (0, _react.useRef)(null);
54
- const canvasReference = (0, _react.useRef)(null);
55
- const screenshareReference = (0, _react.useRef)(null);
65
+ const [renderChildren, setRenderChildren] = (0, _react.useState)();
66
+ const context = (0, _react.useContext)(proctoredContext);
67
+ const {
68
+ actions,
69
+ permissions,
70
+ references,
71
+ permissionSetter,
72
+ customProps,
73
+ customSetter
74
+ } = context;
75
+ (0, _react.useEffect)(() => {
76
+ if (customProps.childrenRenderer === undefined) {
77
+ setRenderChildren(!shouldRenderChildren);
78
+ } else {
79
+ setRenderChildren(customProps.childrenRenderer);
80
+ }
81
+ }, [customProps]);
82
+ const CustomPermissionView = customPermissionView;
83
+ const browserDetails = {
84
+ isChrome: (0, _browserUtils.isChrome)()
85
+ };
56
86
  const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
57
87
  const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
58
88
  const {
59
89
  recurring = false,
60
90
  recurringFetchInterval = 0
61
91
  } = config;
62
- const [audioPermission, setAudioPermission] = (0, _react.useState)();
63
- const [videoPermission, setVideoPermission] = (0, _react.useState)();
64
- const [screensharePermission, setScreensharePermission] = (0, _react.useState)(!proctorParams.screenshareSnapshots);
65
- const firstFullScreenDone = (0, _react.useRef)(false);
66
92
  const recurringFetchIntervalRef = (0, _react.useRef)(null);
67
93
  const sendScreengrab = (0, _react.useCallback)(async function () {
68
94
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
@@ -78,9 +104,9 @@ const ProctorApp = _ref => {
78
104
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
79
105
 
80
106
  if (proctorParams.webcamSnapshots) {
81
- const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(webcamReference);
107
+ const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
82
108
 
83
- if (webcamReference) {
109
+ if (references.webcamReference) {
84
110
  getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
85
111
  }
86
112
  }
@@ -90,12 +116,8 @@ const ProctorApp = _ref => {
90
116
  let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
91
117
  getProctorParamValues(proctoringIdentifier, statistics.current, isBreach, breachParam);
92
118
  }, [proctoringIdentifier, getProctorParamValues]);
93
- const {
94
- isFullscreen,
95
- setFullscreen
96
- } = (0, _hooks.useFullscreenData)(firstFullScreenDone, proctorParams.fullscreenExit);
97
- const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(webcamReference, canvasReference, proctorParams);
98
- const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch) && firstFullScreenDone.current;
119
+ const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(references.webcamReference, references.canvasReference, proctorParams);
120
+ const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch);
99
121
  (0, _react.useEffect)(() => {
100
122
  if (recurring) {
101
123
  recurringFetchIntervalRef.current = setInterval(() => {
@@ -113,9 +135,9 @@ const ProctorApp = _ref => {
113
135
  const currentStats = {
114
136
  userCount,
115
137
  isTabSwitched,
116
- isFullscreen,
138
+ isFullScreen: permissions.fullscreen,
117
139
  lookedAwayCount,
118
- isWebcamDataReliable: isWebcamProcessingReliable
140
+ isWebcamDataNotReliable: !isWebcamProcessingReliable
119
141
  };
120
142
  const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats, proctorParams);
121
143
  (0, _utils.updateStatistics)(statistics, currentStats, proctorParams);
@@ -125,30 +147,32 @@ const ProctorApp = _ref => {
125
147
  sendWebcamSnapshot(true, breachData.breachedParam);
126
148
  sendScreengrab(true, breachData.breachedParam);
127
149
  }
128
- }, [userCount, isTabSwitched, isFullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
129
- const updateScreensharePermission = (0, _react.useCallback)(() => {
130
- (0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
131
- }, []);
132
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _breachUtils.showProctoredComponent)(proctorParams, {
133
- isFullscreen,
134
- audioPermission,
135
- videoPermission,
136
- screensharePermission
137
- }) && children, /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
150
+ }, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
151
+ return /*#__PURE__*/_react.default.createElement("div", {
152
+ className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth" : "fullwidth")
153
+ }, (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren && children, !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
154
+ permissions: permissions,
155
+ hasAllPermission: actions.hasAllPermission,
156
+ askPermission: actions.askPermission,
157
+ references: references,
158
+ actions: actions,
159
+ browserDetails: browserDetails,
160
+ renderChildren: () => {
161
+ setRenderChildren(true);
162
+ customSetter.childrenRenderer(true);
163
+ }
164
+ }, permissionPassedProps)), !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
138
165
  proctorParams: proctorParams,
139
- isFullscreen: isFullscreen,
140
- audioPermisison: audioPermission,
141
- videoPermission: videoPermission,
142
- setFullscreen: setFullscreen,
143
- screensharePermission: screensharePermission,
144
- updateScreensharePermission: updateScreensharePermission
145
- }), /*#__PURE__*/_react.default.createElement(_.ActivityTracker, {
166
+ permissions: permissions,
167
+ askPermission: actions.askPermission,
168
+ hasAllPermission: actions.hasAllPermission
169
+ }), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
146
170
  proctorParams: proctorParams,
147
- setAudioPermission: setAudioPermission,
148
- setVideoPermission: setVideoPermission,
149
- webcamReference: webcamReference,
150
- canvasReference: canvasReference,
151
- screenshareReference: screenshareReference
171
+ setAudioPermission: permissionSetter.audio,
172
+ setVideoPermission: permissionSetter.video,
173
+ webcamReference: references.webcamReference,
174
+ canvasReference: references.canvasReference,
175
+ screenshareReference: references.screenshareReference
152
176
  }));
153
177
  };
154
178
 
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("core-js/modules/web.dom-collections.iterator.js");
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _hooks = require("../hooks");
13
+
14
+ var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
15
+
16
+ var _defaults = require("../constants/defaults");
17
+
18
+ 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); }
19
+
20
+ 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; }
21
+
22
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
23
+
24
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
25
+
26
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
27
+
28
+ const ProctoredContextApp = _ref => {
29
+ let {
30
+ contextProvider,
31
+ config = {
32
+ proctorParams: _defaults.defaultConfig
33
+ },
34
+ children
35
+ } = _ref;
36
+ const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
37
+ const {
38
+ isFullscreen,
39
+ setFullscreen
40
+ } = (0, _hooks.useFullscreenData)(proctorParams.fullscreenExit);
41
+ const [audioPermisison, setAudioPermission] = (0, _react.useState)();
42
+ const [videoPermission, setVideoPermission] = (0, _react.useState)();
43
+ const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
44
+ const [customRenderer, setCustomRenderer] = (0, _react.useState)();
45
+ const webcamReference = (0, _react.useRef)(null);
46
+ const canvasReference = (0, _react.useRef)(null);
47
+ const screenshareReference = (0, _react.useRef)(null);
48
+ const Context = contextProvider;
49
+ const askPermissionAction = {
50
+ 'screenshare': () => {
51
+ (0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
52
+ },
53
+ 'fullscreen': () => {
54
+ setFullscreen();
55
+ }
56
+ };
57
+ const getPermissionObj = {
58
+ 'video': videoPermission,
59
+ 'audio': audioPermisison,
60
+ 'fullscreen': isFullscreen,
61
+ 'screenshare': screensharePermission
62
+ };
63
+ const askPermission = (0, _react.useCallback)(requiredPermissions => {
64
+ requiredPermissions.forEach(element => {
65
+ if (!getPermissionObj[element] && askPermissionAction[element]) {
66
+ askPermissionAction[element]();
67
+ }
68
+ });
69
+ }, [getPermissionObj, askPermissionAction]);
70
+ const hasAllPermission = (0, _react.useCallback)(requiredPermissions => {
71
+ let hasPermission = true;
72
+ requiredPermissions.forEach(element => {
73
+ if (!getPermissionObj[element]) {
74
+ hasPermission = hasPermission && false;
75
+ }
76
+ });
77
+ return hasPermission;
78
+ }, [getPermissionObj]);
79
+ return /*#__PURE__*/_react.default.createElement(Context.Provider, {
80
+ value: {
81
+ permissions: getPermissionObj,
82
+ permissionSetter: {
83
+ 'audio': setAudioPermission,
84
+ 'video': setVideoPermission,
85
+ 'screenshare': setScreensharePermission
86
+ },
87
+ customProps: {
88
+ 'childrenRenderer': customRenderer
89
+ },
90
+ customSetter: {
91
+ 'childrenRenderer': setCustomRenderer
92
+ },
93
+ proctorParams,
94
+ actions: {
95
+ 'askPermission': askPermission,
96
+ 'hasAllPermission': hasAllPermission
97
+ },
98
+ references: {
99
+ 'webcamReference': webcamReference,
100
+ 'canvasReference': canvasReference,
101
+ 'screenshareReference': screenshareReference
102
+ }
103
+ }
104
+ }, children);
105
+ };
106
+
107
+ var _default = ProctoredContextApp;
108
+ exports.default = _default;
@@ -32,9 +32,9 @@ const ActivityTracker = _ref => {
32
32
  proctorParams,
33
33
  webcamReference,
34
34
  canvasReference,
35
+ screenshareReference,
35
36
  setAudioPermission,
36
- setVideoPermission,
37
- screenshareReference
37
+ setVideoPermission
38
38
  } = _ref;
39
39
  (0, _react.useEffect)(() => {
40
40
  if ((0, _browserUtils.isChrome)()) {
@@ -141,7 +141,7 @@ const ActivityTracker = _ref => {
141
141
  ref: canvasReference,
142
142
  className: "captured-video-canvas",
143
143
  id: "wc-ref"
144
- })), proctorParams.screenshareSnapshots && /*#__PURE__*/_react.default.createElement("video", {
144
+ })), /*#__PURE__*/_react.default.createElement("video", {
145
145
  ref: screenshareReference,
146
146
  className: "captured-video-canvas",
147
147
  id: "ss-ref"
@@ -21,11 +21,27 @@ Object.defineProperty(exports, "ProctorApp", {
21
21
  return _ProctorApp.default;
22
22
  }
23
23
  });
24
+ Object.defineProperty(exports, "ProctoredContextApp", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _ProctoredContextApp.default;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "ScreenshareTracker", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _screenshare.ScreenshareTracker;
34
+ }
35
+ });
24
36
 
25
37
  var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
26
38
 
27
39
  var _permissions = require("./permissions");
28
40
 
41
+ var _screenshare = require("./screenshare");
42
+
29
43
  var _ProctorApp = _interopRequireDefault(require("./ProctorApp"));
30
44
 
45
+ var _ProctoredContextApp = _interopRequireDefault(require("./ProctoredContextApp"));
46
+
31
47
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,8 @@
1
+ .disable-copy-paste {
2
+ -webkit-user-select: none;
3
+ -ms-user-select: none;
4
+ user-select: none;
5
+ }
6
+ .fullwidth {
7
+ width: 100%;
8
+ }
@@ -30,14 +30,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
30
30
  const Permission = _ref => {
31
31
  let {
32
32
  proctorParams,
33
- isFullscreen,
34
- audioPermisison,
35
- videoPermission,
36
- setFullscreen,
37
- screensharePermission,
38
- updateScreensharePermission
33
+ permissions,
34
+ askPermission,
35
+ hasAllPermission
39
36
  } = _ref;
40
- const showPermissionModal = isFullscreen === false || (0, _breachUtils.isWebcamRequired)(proctorParams) && audioPermisison === false || (0, _breachUtils.isWebcamRequired)(proctorParams) && videoPermission === false || !screensharePermission;
37
+ const showPermissionModal = !hasAllPermission((0, _breachUtils.getRequiredPermissionsFromProctorParams)(proctorParams));
41
38
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
42
39
  show: showPermissionModal,
43
40
  size: "lg",
@@ -61,18 +58,18 @@ const Permission = _ref => {
61
58
  }, /*#__PURE__*/_react.default.createElement("source", {
62
59
  src: _askPermission.default
63
60
  }), text.VIDEO_UNSUPPORTED_IN_BROWSER)), /*#__PURE__*/_react.default.createElement(_permissionBody.PermissionBody, {
64
- showFullscreenText: !isFullscreen,
65
- showAudioPermissionText: !audioPermisison && (0, _breachUtils.isWebcamRequired)(proctorParams),
66
- showVideoPermissionText: !videoPermission && (0, _breachUtils.isWebcamRequired)(proctorParams),
67
- showScreensharePermission: !screensharePermission && proctorParams.screenshareSnapshots
68
- })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !screensharePermission && proctorParams.screenshareSnapshots && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
61
+ showFullscreenText: !permissions.fullscreen,
62
+ showAudioPermissionText: !permissions.audio && (0, _breachUtils.isWebcamRequired)(proctorParams),
63
+ showVideoPermissionText: !permissions.video && (0, _breachUtils.isWebcamRequired)(proctorParams),
64
+ showScreensharePermission: !permissions.screenshare && proctorParams.screenshareSnapshots
65
+ })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !permissions.screenshare && proctorParams.screenshareSnapshots && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
69
66
  onClick: () => {
70
- updateScreensharePermission();
67
+ askPermission(['screenshare']);
71
68
  }
72
- }, text.ALLOW_SCREENSHARE), screensharePermission && !isFullscreen && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
69
+ }, text.ALLOW_SCREENSHARE), !permissions.fullscreen && proctorParams.fullscreenExit && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
73
70
  variant: "primary",
74
71
  onClick: () => {
75
- setFullscreen();
72
+ askPermission(['fullscreen']);
76
73
  }
77
74
  }, text.ALLOW_FULLSCREEN)));
78
75
  };
@@ -34,7 +34,7 @@ const PermissionBody = _ref => {
34
34
  className: "mb-2"
35
35
  }, text.PERMISSION_GENERIC), showScreensharePermission && /*#__PURE__*/_react.default.createElement("div", {
36
36
  className: "mb-2"
37
- }, (0, _browserUtils.isChrome)() && /*#__PURE__*/_react.default.createElement("strong", null, "Please switch to chrome"), /*#__PURE__*/_react.default.createElement("span", {
37
+ }, !(0, _browserUtils.isChrome)() && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("strong", null, "Please switch to chrome"), /*#__PURE__*/_react.default.createElement("br", null)), /*#__PURE__*/_react.default.createElement("span", {
38
38
  className: "pr-2 font-weight-bold"
39
39
  }, "Screenshare:"), text.PERMISSION_SCREENSHARE), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/_react.default.createElement("div", {
40
40
  className: "mb-2"
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ScreenshareTracker = void 0;
7
+
8
+ require("core-js/modules/web.dom-collections.iterator.js");
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
13
+
14
+ 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); }
15
+
16
+ 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; }
17
+
18
+ const ScreenshareTracker = _ref => {
19
+ let {
20
+ triggerRequestPermission,
21
+ permissionChangeCallback
22
+ } = _ref;
23
+ const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
24
+ const screenshareReference = (0, _react.useRef)(null);
25
+ (0, _react.useEffect)(() => {
26
+ permissionChangeCallback(screensharePermission);
27
+ }, [screensharePermission, permissionChangeCallback]);
28
+ (0, _react.useEffect)(() => {
29
+ if (triggerRequestPermission) {
30
+ (0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
31
+ }
32
+ }, [triggerRequestPermission]);
33
+ return /*#__PURE__*/_react.default.createElement("video", {
34
+ ref: screenshareReference,
35
+ className: "captured-video-canvas",
36
+ id: "ss-ref"
37
+ });
38
+ };
39
+
40
+ exports.ScreenshareTracker = ScreenshareTracker;
@@ -0,0 +1,4 @@
1
+ .captured-video-canvas {
2
+ visibility: hidden;
3
+ position: absolute;
4
+ }
@@ -3,20 +3,21 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.initialValues = exports.gpuTypes = exports.evaluateVideoIntervalInSeconds = exports.defaultConfig = exports.STATS_PARAMS = exports.INITIAL_STATISTICS = void 0;
6
+ exports.proctorParamsToPermission = exports.initialValues = exports.gpuTypes = exports.evaluateVideoIntervalInSeconds = exports.defaultConfig = exports.STATS_PARAMS = exports.INITIAL_STATISTICS = void 0;
7
7
  const defaultConfig = {
8
8
  people: true,
9
9
  tabSwitch: true,
10
10
  fullscreenExit: true,
11
11
  lookedAway: true,
12
12
  webcamSnapshots: true,
13
- screenshareSnapshots: true
13
+ screenshareSnapshots: true,
14
+ copyPasteProctoring: true
14
15
  };
15
16
  exports.defaultConfig = defaultConfig;
16
17
  const initialValues = {
17
18
  isTabSwitched: false,
18
19
  userCount: 0,
19
- isWebcamDataReliable: true,
20
+ isWebcamDataNotReliable: true,
20
21
  isWatching: true,
21
22
  canOpenFullScreen: false,
22
23
  isFullscreen: false,
@@ -29,7 +30,7 @@ const STATS_PARAMS = {
29
30
  isFullscreen: "IS_FULLSCREEN",
30
31
  lookedAwayCount: "LOOKED_AWAY_COUNT",
31
32
  userCountMax: "USER_COUNT_MAX",
32
- isWebcamReliable: "IS_WEBCAM_DATA_RELIABLE"
33
+ isWebcamNotReliable: "IS_WEBCAM_DATA_NOT_RELIABLE"
33
34
  };
34
35
  exports.STATS_PARAMS = STATS_PARAMS;
35
36
  const INITIAL_STATISTICS = {
@@ -37,9 +38,16 @@ const INITIAL_STATISTICS = {
37
38
  [STATS_PARAMS.isFullscreen]: initialValues.isFullscreen,
38
39
  [STATS_PARAMS.lookedAwayCount]: initialValues.lookedAwayCount,
39
40
  [STATS_PARAMS.userCountMax]: initialValues.userCount,
40
- [STATS_PARAMS.isWebcamReliable]: initialValues.isWebcamDataReliable
41
+ [STATS_PARAMS.isWebcamNotReliable]: initialValues.isWebcamDataNotReliable
41
42
  };
42
43
  exports.INITIAL_STATISTICS = INITIAL_STATISTICS;
44
+ const proctorParamsToPermission = {
45
+ fullscreenExit: "fullscreen",
46
+ lookedAway: "video",
47
+ webcamSnapshots: "video",
48
+ screenshareSnapshots: "screenshare"
49
+ };
50
+ exports.proctorParamsToPermission = proctorParamsToPermission;
43
51
  const evaluateVideoIntervalInSeconds = 5;
44
52
  exports.evaluateVideoIntervalInSeconds = evaluateVideoIntervalInSeconds;
45
53
  const gpuTypes = ["intel", "apple", "amd", "radeon", "nvidia", "geforce"];
@@ -7,20 +7,19 @@ exports.default = useFullscreenData;
7
7
 
8
8
  require("core-js/modules/web.dom-collections.iterator.js");
9
9
 
10
- var _react = require("react");
10
+ var _react = _interopRequireWildcard(require("react"));
11
11
 
12
12
  var _utils = require("../utils");
13
13
 
14
+ 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); }
15
+
16
+ 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; }
17
+
14
18
  const browserFullscreenElementProp = (0, _utils.getBrowserFullscreenElementProp)();
15
19
 
16
- function useFullscreenData(firstFullScreenDone, isProctorParam) {
20
+ function useFullscreenData(isProctorParam) {
17
21
  const fullScreenElement = (0, _react.useRef)(document.documentElement);
18
22
  const [isFullscreen, setIsFullscreen] = (0, _react.useState)(document[browserFullscreenElementProp] != null);
19
- (0, _react.useEffect)(() => {
20
- if (isFullscreen && !firstFullScreenDone.current || !isProctorParam) {
21
- firstFullScreenDone.current = true;
22
- }
23
- }, [isFullscreen, firstFullScreenDone, isProctorParam]);
24
23
 
25
24
  const setFullscreen = () => {
26
25
  if (!fullScreenElement || !fullScreenElement.current) {
@@ -27,5 +27,5 @@ function usePageVisibility(isProctorParam) {
27
27
  document.removeEventListener(visibilityChangeEvent, updateVisibility);
28
28
  };
29
29
  }, []);
30
- return !isVisible && isProctorParam;
30
+ return isVisible && isProctorParam;
31
31
  }
package/dist/index.js CHANGED
@@ -9,5 +9,11 @@ Object.defineProperty(exports, "ProctorApp", {
9
9
  return _components.ProctorApp;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "ProctoredContextApp", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _components.ProctoredContextApp;
16
+ }
17
+ });
12
18
 
13
19
  var _components = require("./components");
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ class ProctoringTracker {
9
+ constructor() {}
10
+
11
+ askProctoredPermission() {}
12
+
13
+ hasProctoredPermission() {}
14
+
15
+ }
16
+
17
+ exports.default = ProctoringTracker;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.showProctoredComponent = exports.isWebcamRequired = exports.getInitialStats = exports.getDataOnBreach = void 0;
6
+ exports.showProctoredComponent = exports.isWebcamRequired = exports.getRequiredPermissionsFromProctorParams = exports.getInitialStats = exports.getDataOnBreach = void 0;
7
7
 
8
8
  var _defaults = require("../constants/defaults");
9
9
 
@@ -37,12 +37,26 @@ const getInitialStats = proctorParams => {
37
37
 
38
38
  exports.getInitialStats = getInitialStats;
39
39
 
40
+ const getRequiredPermissionsFromProctorParams = proctorParams => {
41
+ const requiredPermissions = [];
42
+
43
+ for (const key in proctorParams) {
44
+ if (proctorParams[key] && _defaults.proctorParamsToPermission[key]) {
45
+ requiredPermissions.push(_defaults.proctorParamsToPermission[key]);
46
+ }
47
+ }
48
+
49
+ return requiredPermissions;
50
+ };
51
+
52
+ exports.getRequiredPermissionsFromProctorParams = getRequiredPermissionsFromProctorParams;
53
+
40
54
  const isWebcamRequired = proctorParams => proctorParams.people || proctorParams.lookedAway || proctorParams.webcamSnapshots;
41
55
 
42
56
  exports.isWebcamRequired = isWebcamRequired;
43
57
 
44
- const showProctoredComponent = (proctorParams, permissions) => {
45
- return (!proctorParams.fullscreenExit || permissions.isFullscreen) && (!isWebcamRequired(proctorParams) || permissions.audioPermission && permissions.videoPermission) && (!proctorParams.screenshareSnapshots || permissions.screensharePermission);
58
+ const showProctoredComponent = (proctorParams, hasAllPermission) => {
59
+ return hasAllPermission(getRequiredPermissionsFromProctorParams(proctorParams));
46
60
  };
47
61
 
48
62
  exports.showProctoredComponent = showProctoredComponent;
@@ -53,18 +67,18 @@ const getDataOnBreach = (statistics, currentData, proctorParams) => {
53
67
  isTabSwitched,
54
68
  isFullscreen,
55
69
  lookedAwayCount,
56
- isWebcamDataReliable
70
+ isWebcamDataNotReliable
57
71
  } = currentData;
58
72
  const timestamp = Date.now();
59
73
  const data = statistics.current;
60
- const isWebCamReliableParam = _defaults.STATS_PARAMS.isWebcamReliable;
74
+ const isWebCamNotReliableParam = _defaults.STATS_PARAMS.isWebcamNotReliable;
61
75
 
62
- if (isWebcamRequired(proctorParams) && data[isWebCamReliableParam] !== isWebcamDataReliable) {
76
+ if (isWebcamRequired(proctorParams) && data[isWebCamNotReliableParam]) {
63
77
  return {
64
- breachedParam: isWebCamReliableParam,
78
+ breachedParam: isWebCamNotReliableParam,
65
79
  timestamp,
66
80
  data: _objectSpread(_objectSpread({}, data), {}, {
67
- [isWebCamReliableParam]: isWebcamDataReliable
81
+ [isWebCamNotReliableParam]: isWebCamNotReliableParam
68
82
  })
69
83
  };
70
84
  }
@@ -13,6 +13,8 @@ require("core-js/modules/es.array-buffer.slice.js");
13
13
 
14
14
  require("core-js/modules/es.typed-array.uint8-array.js");
15
15
 
16
+ require("core-js/modules/es.typed-array.fill.js");
17
+
16
18
  require("core-js/modules/es.typed-array.set.js");
17
19
 
18
20
  require("core-js/modules/es.typed-array.sort.js");
@@ -151,6 +153,7 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
151
153
  const track = stream.getTracks()[0];
152
154
 
153
155
  if (track.getSettings().displaySurface === "monitor") {
156
+ setScreensharePermission(true);
154
157
  screenshareReference.current.srcObject = stream;
155
158
 
156
159
  screenshareReference.current.onloadedmetadata = e => {
@@ -159,9 +162,8 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
159
162
 
160
163
  track.onended = e => {
161
164
  setScreensharePermission(false);
165
+ screenshareReference.current.srcObject = null;
162
166
  };
163
-
164
- setScreensharePermission(true);
165
167
  } else {
166
168
  screenshareReference.current = null;
167
169
  setScreensharePermission(false);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newtonschool/react_proctoring_library",
3
- "version": "0.0.17",
3
+ "version": "0.0.20",
4
4
  "description": "Used to proctor online tests",
5
5
  "author": "ayushkagrawal,shreyachandra",
6
6
  "main": "dist/index.js",
@@ -54,4 +54,4 @@
54
54
  "@babel/preset-env": "^7.16.7",
55
55
  "react-scripts": ">=5.0.0"
56
56
  }
57
- }
57
+ }
@@ -1,33 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.retrieveStatsFromLocalStorage = exports.removeStatsFromLocalStorage = exports.getStatistics = exports.addOrUpdateStatsToLocalStorage = void 0;
7
-
8
- require("core-js/modules/es.json.stringify.js");
9
-
10
- const addOrUpdateStatsToLocalStorage = (proctoringIdentifier, data) => {
11
- const stringifiedData = JSON.stringify(data);
12
- localStorage.setItem(proctoringIdentifier, stringifiedData);
13
- };
14
-
15
- exports.addOrUpdateStatsToLocalStorage = addOrUpdateStatsToLocalStorage;
16
-
17
- const retrieveStatsFromLocalStorage = proctoringIdentifier => {
18
- return localStorage.getItem(proctoringIdentifier);
19
- };
20
-
21
- exports.retrieveStatsFromLocalStorage = retrieveStatsFromLocalStorage;
22
-
23
- const removeStatsFromLocalStorage = proctoringIdentifier => {
24
- localStorage.removeItem(proctoringIdentifier);
25
- };
26
-
27
- exports.removeStatsFromLocalStorage = removeStatsFromLocalStorage;
28
-
29
- const getStatistics = proctoringIdentifier => {
30
- return JSON.parse(retrieveStatsFromLocalStorage(proctoringIdentifier));
31
- };
32
-
33
- exports.getStatistics = getStatistics;