@newtonschool/react_proctoring_library 0.0.74 → 0.0.76
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/webcam-activity-tracker/electron.js +46 -32
- package/dist/hooks/electron/{useKishokMode.js → useKioskMode.js} +13 -4
- 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;
|
|
@@ -5,11 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = ElectronWebCam;
|
|
8
|
-
require("core-js/modules/es.
|
|
9
|
-
require("core-js/modules/es.
|
|
8
|
+
require("core-js/modules/es.array.includes.js");
|
|
9
|
+
require("core-js/modules/es.string.includes.js");
|
|
10
10
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
11
|
+
require("core-js/modules/es.promise.js");
|
|
11
12
|
var _react = require("react");
|
|
12
|
-
var
|
|
13
|
+
var _reactWebcam = _interopRequireDefault(require("react-webcam"));
|
|
13
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
16
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
@@ -17,31 +18,34 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
17
18
|
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; }
|
|
18
19
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
19
20
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const getMacBookDevice = function getMacBookDevice() {
|
|
22
|
+
let devices = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
23
|
+
if (devices.length === 1) {
|
|
24
|
+
return devices[0];
|
|
25
|
+
}
|
|
26
|
+
return devices.find(device => device.label.includes('FaceTime HD Camera'));
|
|
27
|
+
};
|
|
23
28
|
function ElectronWebCam(_ref) {
|
|
24
29
|
let {
|
|
25
30
|
setAskPermissionAction,
|
|
26
31
|
proctoredContext,
|
|
27
|
-
proctorParams,
|
|
28
32
|
config
|
|
29
33
|
} = _ref;
|
|
30
34
|
const {
|
|
31
35
|
permissionSetter,
|
|
32
|
-
permissions,
|
|
33
36
|
references,
|
|
34
37
|
setPermissionErrors,
|
|
35
38
|
device
|
|
36
39
|
} = (0, _react.useContext)(proctoredContext);
|
|
40
|
+
const [permissionGrantedInElectron, setPermissionGrantedInElectron] = (0, _react.useState)(false);
|
|
37
41
|
const setVideoPermission = permissionSetter.video;
|
|
38
|
-
const isVideoTurnedOn = permissions.video;
|
|
39
42
|
const webcamReference = references.webcamReference;
|
|
40
43
|
const {
|
|
41
44
|
recurring = false,
|
|
42
45
|
recurringFetchInterval = 30000
|
|
43
46
|
} = config;
|
|
44
47
|
const deviceId = device === null || device === void 0 ? void 0 : device.webCamDeviceId;
|
|
48
|
+
const [retry, setRetry] = (0, _react.useState)(0);
|
|
45
49
|
(0, _react.useEffect)(() => {
|
|
46
50
|
setAskPermissionAction(oldAskPermissionAction => _objectSpread(_objectSpread({}, oldAskPermissionAction), {}, {
|
|
47
51
|
video: async () => {
|
|
@@ -58,17 +62,13 @@ function ElectronWebCam(_ref) {
|
|
|
58
62
|
if (devices.length === 0) {
|
|
59
63
|
throw new Error('No webcam devices found');
|
|
60
64
|
}
|
|
61
|
-
const
|
|
65
|
+
const macBookDevice = getMacBookDevice(devices);
|
|
66
|
+
if (!device) {
|
|
67
|
+
throw new Error('No webcam devices found');
|
|
68
|
+
}
|
|
69
|
+
const permissionGranted = await window.electron.actions.startWebCamRecording(macBookDevice.deviceId);
|
|
62
70
|
if (permissionGranted) {
|
|
63
|
-
device.setWebCamDeviceId(
|
|
64
|
-
navigator.mediaDevices.getUserMedia({
|
|
65
|
-
video: true
|
|
66
|
-
}).then(streams => {
|
|
67
|
-
const stream = streams.getVideoTracks()[0];
|
|
68
|
-
webcamReference.current = {
|
|
69
|
-
stream
|
|
70
|
-
};
|
|
71
|
-
});
|
|
71
|
+
device.setWebCamDeviceId(macBookDevice.deviceId);
|
|
72
72
|
} else {
|
|
73
73
|
throw new Error('Error starting webcam recording');
|
|
74
74
|
}
|
|
@@ -94,7 +94,7 @@ function ElectronWebCam(_ref) {
|
|
|
94
94
|
fileUploadConfig: config.fileUploadConfig
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
|
-
|
|
97
|
+
setPermissionGrantedInElectron(true);
|
|
98
98
|
} catch (error) {
|
|
99
99
|
setPermissionErrors(oldErrors => _objectSpread(_objectSpread({}, oldErrors || {}), {}, {
|
|
100
100
|
video: (error === null || error === void 0 ? void 0 : error.message) || 'Error while taking webcam snapshot'
|
|
@@ -104,14 +104,14 @@ function ElectronWebCam(_ref) {
|
|
|
104
104
|
if (deviceId) {
|
|
105
105
|
startWebCamSnapshot();
|
|
106
106
|
}
|
|
107
|
-
}, [config.fileUploadConfig, deviceId, recurring, recurringFetchInterval,
|
|
107
|
+
}, [config.fileUploadConfig, deviceId, recurring, recurringFetchInterval, device.webCamDeviceId]);
|
|
108
108
|
(0, _react.useEffect)(() => {
|
|
109
109
|
if (deviceId) {
|
|
110
110
|
const permissionSetter = permission => {
|
|
111
|
-
|
|
111
|
+
setPermissionGrantedInElectron(permission);
|
|
112
112
|
};
|
|
113
113
|
window.electron.states.isWebCamRecordingStarted(deviceId).then(permission => {
|
|
114
|
-
|
|
114
|
+
setPermissionGrantedInElectron(permission);
|
|
115
115
|
});
|
|
116
116
|
const id = window.electron.listener.webCamSnapshotRecordingStatusChanged(deviceId, permissionSetter);
|
|
117
117
|
return () => {
|
|
@@ -119,13 +119,27 @@ function ElectronWebCam(_ref) {
|
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
121
|
}, [deviceId]);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
122
|
+
(0, _react.useEffect)(() => {
|
|
123
|
+
if (!permissionGrantedInElectron) {
|
|
124
|
+
setVideoPermission(false);
|
|
125
|
+
}
|
|
126
|
+
}, [permissionGrantedInElectron]);
|
|
127
|
+
if (!permissionGrantedInElectron) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactWebcam.default, {
|
|
131
|
+
audio: false,
|
|
132
|
+
screenshotFormat: "image/jpeg",
|
|
133
|
+
onUserMedia: () => {
|
|
134
|
+
setVideoPermission(true);
|
|
135
|
+
},
|
|
136
|
+
onUserMediaError: () => {
|
|
137
|
+
if (retry < 3) {
|
|
138
|
+
setRetry(retry + 1);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
ref: webcamReference,
|
|
142
|
+
className: "captured-video-canvas hide",
|
|
143
|
+
id: 'WEBCAM_REFERENCE_ID'
|
|
144
|
+
}, "".concat(deviceId, "-").concat(retry));
|
|
131
145
|
}
|
|
@@ -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
|
|
@@ -24,6 +24,15 @@ function useKishokMode(_ref) {
|
|
|
24
24
|
isFullscreen
|
|
25
25
|
} = (0, _useGenericFullScreenData.default)(isElectronApp);
|
|
26
26
|
const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, permissions);
|
|
27
|
+
const [isDocumentFocused, setIsDocumentFocused] = (0, _react.useState)(true);
|
|
28
|
+
(0, _react.useEffect)(() => {
|
|
29
|
+
window.addEventListener('focus', () => {
|
|
30
|
+
setIsDocumentFocused(true);
|
|
31
|
+
});
|
|
32
|
+
window.addEventListener('blur', () => {
|
|
33
|
+
setIsDocumentFocused(false);
|
|
34
|
+
});
|
|
35
|
+
}, []);
|
|
27
36
|
(0, _react.useEffect)(() => {
|
|
28
37
|
const updateOnlineStatus = () => {
|
|
29
38
|
setConnectedToInternet(window.navigator.onLine);
|
|
@@ -33,11 +42,11 @@ function useKishokMode(_ref) {
|
|
|
33
42
|
updateOnlineStatus();
|
|
34
43
|
}, []);
|
|
35
44
|
(0, _react.useEffect)(() => {
|
|
36
|
-
if (typeof window !== 'undefined' && shouldShowProctoredComponent && isFullscreen && isElectronApp && connectedToInternet) {
|
|
45
|
+
if (typeof window !== 'undefined' && shouldShowProctoredComponent && isFullscreen && isElectronApp && connectedToInternet && isDocumentFocused) {
|
|
37
46
|
window.electron.actions.enableKioskMode();
|
|
38
47
|
} else {
|
|
39
48
|
var _window$electron, _window$electron$acti;
|
|
40
49
|
(_window$electron = window.electron) === null || _window$electron === void 0 ? void 0 : (_window$electron$acti = _window$electron.actions) === null || _window$electron$acti === void 0 ? void 0 : _window$electron$acti.disableKioskMode();
|
|
41
50
|
}
|
|
42
|
-
}, [isFullscreen, shouldShowProctoredComponent, isElectronApp]);
|
|
51
|
+
}, [isFullscreen, shouldShowProctoredComponent, isElectronApp, isDocumentFocused]);
|
|
43
52
|
}
|
|
@@ -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
|