@newtonschool/react_proctoring_library 0.0.75 → 0.0.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/fullscreen/index.js +5 -3
- package/dist/components/proctor-app/index.js +5 -2
- package/dist/components/proctor-context-app/index.js +6 -1
- package/dist/components/screenshare-activity-tracker/electron.js +11 -13
- package/dist/components/webcam-activity-tracker/electron.js +24 -23
- package/dist/hooks/electron/{useKishokMode.js → useKioskMode.js} +2 -2
- package/dist/hooks/electron/usePageVisibility.js +8 -20
- package/dist/hooks/useGenericFullScreenData.js +1 -0
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@ require("core-js/modules/es.symbol.description.js");
|
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
var _useGenericFullScreenData = _interopRequireDefault(require("../../hooks/useGenericFullScreenData"));
|
|
10
10
|
var _ElectronContext = require("../../contexts/ElectronContext");
|
|
11
|
-
var
|
|
11
|
+
var _useKioskMode = _interopRequireDefault(require("../../hooks/electron/useKioskMode"));
|
|
12
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
13
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
14
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
@@ -25,13 +25,15 @@ function FullScreen(_ref) {
|
|
|
25
25
|
const {
|
|
26
26
|
setFullscreen
|
|
27
27
|
} = (0, _useGenericFullScreenData.default)(isElectronApp);
|
|
28
|
-
(0,
|
|
28
|
+
(0, _useKioskMode.default)({
|
|
29
29
|
proctoredContext,
|
|
30
30
|
proctorParams
|
|
31
31
|
});
|
|
32
32
|
(0, _react.useEffect)(() => {
|
|
33
33
|
setAskPermissionAction(oldAskPermissionAction => _objectSpread(_objectSpread({}, oldAskPermissionAction), {}, {
|
|
34
|
-
fullscreen: () =>
|
|
34
|
+
fullscreen: () => {
|
|
35
|
+
setFullscreen(true);
|
|
36
|
+
}
|
|
35
37
|
}));
|
|
36
38
|
}, [setAskPermissionAction, setFullscreen]);
|
|
37
39
|
return null;
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.default = exports.ProctorApp = void 0;
|
|
9
9
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
10
|
+
require("core-js/modules/es.promise.js");
|
|
10
11
|
var _react = _interopRequireWildcard(require("react"));
|
|
11
12
|
require("./index.scss");
|
|
12
13
|
var _permissions = require("../permissions");
|
|
@@ -64,12 +65,14 @@ const ProctorApp = _ref => {
|
|
|
64
65
|
const CustomPermissionView = customPermissionView;
|
|
65
66
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
66
67
|
const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, permissions);
|
|
67
|
-
const askPermission = (0, _react.useCallback)(requiredPermissions => {
|
|
68
|
+
const askPermission = (0, _react.useCallback)(async requiredPermissions => {
|
|
69
|
+
const allPromises = [];
|
|
68
70
|
requiredPermissions.forEach(element => {
|
|
69
71
|
if (!permissions[element] && askPermissionAction[element]) {
|
|
70
|
-
askPermissionAction[element]();
|
|
72
|
+
allPromises.push(askPermissionAction[element]());
|
|
71
73
|
}
|
|
72
74
|
});
|
|
75
|
+
await Promise.all(allPromises);
|
|
73
76
|
}, [permissions, askPermissionAction]);
|
|
74
77
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
75
78
|
className: "".concat(proctorParams.copyPasteProctoring ? 'disable-copy-paste fullwidth fullheight' : 'fullwidth fullheight'),
|
|
@@ -43,6 +43,7 @@ const ProctoredContextApp = _ref => {
|
|
|
43
43
|
screenshare: null
|
|
44
44
|
});
|
|
45
45
|
const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
|
|
46
|
+
const [_, setUpdateId] = (0, _react.useState)(0);
|
|
46
47
|
const webcamReference = (0, _react.useRef)(null);
|
|
47
48
|
const screenshareReference = (0, _react.useRef)(null);
|
|
48
49
|
const [screenshareStream, setScreenshareStream] = (0, _react.useState)(null);
|
|
@@ -57,6 +58,9 @@ const ProctoredContextApp = _ref => {
|
|
|
57
58
|
fullscreen: isFullscreen,
|
|
58
59
|
screenshare: screensharePermission
|
|
59
60
|
}), [videoPermission, audioPermisison, isFullscreen, screensharePermission]);
|
|
61
|
+
const forceUpdate = () => {
|
|
62
|
+
setUpdateId(oldId => oldId + 1);
|
|
63
|
+
};
|
|
60
64
|
const endTest = () => {
|
|
61
65
|
if (isElectronApp) {
|
|
62
66
|
window.electron.actions.stopProctoring();
|
|
@@ -91,7 +95,8 @@ const ProctoredContextApp = _ref => {
|
|
|
91
95
|
webcamReference,
|
|
92
96
|
screenshareReference
|
|
93
97
|
},
|
|
94
|
-
screenshareStream
|
|
98
|
+
screenshareStream,
|
|
99
|
+
forceUpdate
|
|
95
100
|
}),
|
|
96
101
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ElectronContext.ElectronContextProvider, {
|
|
97
102
|
value: isElectronApp,
|
|
@@ -29,7 +29,7 @@ function ElectronScreenShare(_ref) {
|
|
|
29
29
|
(0, _react.useEffect)(() => {
|
|
30
30
|
setAskPermissionAction(oldAskPermissionAction => _objectSpread(_objectSpread({}, oldAskPermissionAction), {}, {
|
|
31
31
|
screenshare: async () => {
|
|
32
|
-
device.setScreenShareDeviceId(
|
|
32
|
+
device.setScreenShareDeviceId(undefined);
|
|
33
33
|
setPermissionErrors(oldErrors => _objectSpread(_objectSpread({}, oldErrors || {}), {}, {
|
|
34
34
|
screenshare: null
|
|
35
35
|
}));
|
|
@@ -89,18 +89,16 @@ function ElectronScreenShare(_ref) {
|
|
|
89
89
|
}
|
|
90
90
|
}, [streamDeviceId, config]);
|
|
91
91
|
(0, _react.useEffect)(() => {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
}
|
|
92
|
+
const permissionSetter = permission => {
|
|
93
|
+
setScreensharePermission(permission);
|
|
94
|
+
};
|
|
95
|
+
window.electron.states.isScreenShareRecordingStarted(streamDeviceId).then(recordingStarted => {
|
|
96
|
+
permissionSetter(recordingStarted);
|
|
97
|
+
});
|
|
98
|
+
const id = window.electron.listener.screenShareRecordingStatusChanged(streamDeviceId, permissionSetter);
|
|
99
|
+
return () => {
|
|
100
|
+
window.electron.listener.removeListener(id, permissionSetter);
|
|
101
|
+
};
|
|
104
102
|
}, [streamDeviceId]);
|
|
105
103
|
return null;
|
|
106
104
|
}
|
|
@@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = ElectronWebCam;
|
|
8
|
-
require("core-js/modules/
|
|
8
|
+
require("core-js/modules/es.array.includes.js");
|
|
9
|
+
require("core-js/modules/es.string.includes.js");
|
|
9
10
|
require("core-js/modules/es.promise.js");
|
|
10
11
|
var _react = require("react");
|
|
11
12
|
var _reactWebcam = _interopRequireDefault(require("react-webcam"));
|
|
@@ -16,20 +17,27 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
16
17
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
17
18
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
18
19
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
20
|
+
const getMacBookDevice = function getMacBookDevice() {
|
|
21
|
+
let devices = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
22
|
+
if (devices.length === 1) {
|
|
23
|
+
return devices[0];
|
|
24
|
+
}
|
|
25
|
+
return devices.find(device => device.label.includes('FaceTime HD Camera'));
|
|
26
|
+
};
|
|
19
27
|
function ElectronWebCam(_ref) {
|
|
20
28
|
let {
|
|
21
29
|
setAskPermissionAction,
|
|
22
30
|
proctoredContext,
|
|
23
|
-
proctorParams,
|
|
24
31
|
config
|
|
25
32
|
} = _ref;
|
|
26
33
|
const {
|
|
27
34
|
permissionSetter,
|
|
28
35
|
references,
|
|
36
|
+
permissions,
|
|
29
37
|
setPermissionErrors,
|
|
30
|
-
device
|
|
38
|
+
device,
|
|
39
|
+
forceUpdate
|
|
31
40
|
} = (0, _react.useContext)(proctoredContext);
|
|
32
|
-
const [permissionGrantedInElectron, setPermissionGrantedInElectron] = (0, _react.useState)(false);
|
|
33
41
|
const setVideoPermission = permissionSetter.video;
|
|
34
42
|
const webcamReference = references.webcamReference;
|
|
35
43
|
const {
|
|
@@ -37,7 +45,6 @@ function ElectronWebCam(_ref) {
|
|
|
37
45
|
recurringFetchInterval = 30000
|
|
38
46
|
} = config;
|
|
39
47
|
const deviceId = device === null || device === void 0 ? void 0 : device.webCamDeviceId;
|
|
40
|
-
const [retry, setRetry] = (0, _react.useState)(0);
|
|
41
48
|
(0, _react.useEffect)(() => {
|
|
42
49
|
setAskPermissionAction(oldAskPermissionAction => _objectSpread(_objectSpread({}, oldAskPermissionAction), {}, {
|
|
43
50
|
video: async () => {
|
|
@@ -54,9 +61,13 @@ function ElectronWebCam(_ref) {
|
|
|
54
61
|
if (devices.length === 0) {
|
|
55
62
|
throw new Error('No webcam devices found');
|
|
56
63
|
}
|
|
57
|
-
const
|
|
64
|
+
const macBookDevice = getMacBookDevice(devices);
|
|
65
|
+
if (!device) {
|
|
66
|
+
throw new Error('No webcam devices found');
|
|
67
|
+
}
|
|
68
|
+
const permissionGranted = await window.electron.actions.startWebCamRecording(macBookDevice.deviceId);
|
|
58
69
|
if (permissionGranted) {
|
|
59
|
-
device.setWebCamDeviceId(
|
|
70
|
+
device.setWebCamDeviceId(macBookDevice.deviceId);
|
|
60
71
|
} else {
|
|
61
72
|
throw new Error('Error starting webcam recording');
|
|
62
73
|
}
|
|
@@ -82,7 +93,7 @@ function ElectronWebCam(_ref) {
|
|
|
82
93
|
fileUploadConfig: config.fileUploadConfig
|
|
83
94
|
});
|
|
84
95
|
}
|
|
85
|
-
|
|
96
|
+
setVideoPermission(true);
|
|
86
97
|
} catch (error) {
|
|
87
98
|
setPermissionErrors(oldErrors => _objectSpread(_objectSpread({}, oldErrors || {}), {}, {
|
|
88
99
|
video: (error === null || error === void 0 ? void 0 : error.message) || 'Error while taking webcam snapshot'
|
|
@@ -96,10 +107,10 @@ function ElectronWebCam(_ref) {
|
|
|
96
107
|
(0, _react.useEffect)(() => {
|
|
97
108
|
if (deviceId) {
|
|
98
109
|
const permissionSetter = permission => {
|
|
99
|
-
|
|
110
|
+
setVideoPermission(permission);
|
|
100
111
|
};
|
|
101
112
|
window.electron.states.isWebCamRecordingStarted(deviceId).then(permission => {
|
|
102
|
-
|
|
113
|
+
setVideoPermission(true);
|
|
103
114
|
});
|
|
104
115
|
const id = window.electron.listener.webCamSnapshotRecordingStatusChanged(deviceId, permissionSetter);
|
|
105
116
|
return () => {
|
|
@@ -107,27 +118,17 @@ function ElectronWebCam(_ref) {
|
|
|
107
118
|
};
|
|
108
119
|
}
|
|
109
120
|
}, [deviceId]);
|
|
110
|
-
(
|
|
111
|
-
if (!permissionGrantedInElectron) {
|
|
112
|
-
setVideoPermission(false);
|
|
113
|
-
}
|
|
114
|
-
}, [permissionGrantedInElectron]);
|
|
115
|
-
if (!permissionGrantedInElectron) {
|
|
121
|
+
if (!permissions.video) {
|
|
116
122
|
return;
|
|
117
123
|
}
|
|
118
124
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactWebcam.default, {
|
|
119
125
|
audio: false,
|
|
120
126
|
screenshotFormat: "image/jpeg",
|
|
121
127
|
onUserMedia: () => {
|
|
122
|
-
|
|
123
|
-
},
|
|
124
|
-
onUserMediaError: () => {
|
|
125
|
-
if (retry < 3) {
|
|
126
|
-
setRetry(retry + 1);
|
|
127
|
-
}
|
|
128
|
+
forceUpdate(true);
|
|
128
129
|
},
|
|
129
130
|
ref: webcamReference,
|
|
130
131
|
className: "captured-video-canvas hide",
|
|
131
132
|
id: 'WEBCAM_REFERENCE_ID'
|
|
132
|
-
}
|
|
133
|
+
});
|
|
133
134
|
}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default =
|
|
6
|
+
exports.default = useKioskMode;
|
|
7
7
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
var _breachUtils = require("../../utils/breachUtils");
|
|
10
10
|
var _useGenericFullScreenData = _interopRequireDefault(require("../useGenericFullScreenData"));
|
|
11
11
|
var _ElectronContext = require("../../contexts/ElectronContext");
|
|
12
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
function
|
|
13
|
+
function useKioskMode(_ref) {
|
|
14
14
|
let {
|
|
15
15
|
proctoredContext,
|
|
16
16
|
proctorParams
|
|
@@ -3,35 +3,23 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default =
|
|
6
|
+
exports.default = usePageVisibility;
|
|
7
7
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
8
|
-
require("core-js/modules/es.promise.js");
|
|
9
8
|
var _react = require("react");
|
|
10
9
|
var _ElectronContext = require("../../contexts/ElectronContext");
|
|
11
|
-
function
|
|
12
|
-
const [
|
|
10
|
+
function usePageVisibility(isProctorParam) {
|
|
11
|
+
const [isPageFocused, setIsPageFocused] = (0, _react.useState)(true);
|
|
13
12
|
const isElectronApp = (0, _react.useContext)(_ElectronContext.ElectronContext);
|
|
14
|
-
const acquireWakeUpLock = async () => {
|
|
15
|
-
const id = await window.electron.actions.startWakeLock();
|
|
16
|
-
setIsWakeUpLockAcquired(id);
|
|
17
|
-
};
|
|
18
|
-
const releaseWakeUpLock = async () => {
|
|
19
|
-
window.electron.actions.stopWakeLock(isWakeUpLockAcquired);
|
|
20
|
-
setIsWakeUpLockAcquired(0);
|
|
21
|
-
};
|
|
22
13
|
(0, _react.useEffect)(() => {
|
|
23
14
|
if (isElectronApp) {
|
|
24
|
-
const
|
|
25
|
-
|
|
15
|
+
const isPageFocusChanged = isPageFocused => {
|
|
16
|
+
setIsPageFocused(isPageFocused);
|
|
26
17
|
};
|
|
27
|
-
const signal = window.electron.listener.
|
|
18
|
+
const signal = window.electron.listener.isPageFocusedChanged(isPageFocusChanged);
|
|
28
19
|
return () => {
|
|
29
|
-
window.electron.listener.removeListener(signal,
|
|
20
|
+
window.electron.listener.removeListener(signal, isPageFocusChanged);
|
|
30
21
|
};
|
|
31
22
|
}
|
|
32
23
|
}, [isElectronApp]);
|
|
33
|
-
return
|
|
34
|
-
acquireWakeUpLock,
|
|
35
|
-
releaseWakeUpLock
|
|
36
|
-
};
|
|
24
|
+
return isPageFocused && isProctorParam;
|
|
37
25
|
}
|
|
@@ -8,6 +8,7 @@ var _useFullScreenData = _interopRequireDefault(require("./web/useFullScreenData
|
|
|
8
8
|
var _useFullScreenData2 = _interopRequireDefault(require("./electron/useFullScreenData"));
|
|
9
9
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
function useGenericFullScreenData(isElectronApp) {
|
|
11
|
+
console.log(isElectronApp, 'isElectronApp');
|
|
11
12
|
const {
|
|
12
13
|
isFullscreen: webIsFullScreen,
|
|
13
14
|
setFullscreen: setWebIsFullScreen
|