@instructure/quiz-core 17.41.1-rc.14 → 17.41.1-rc.16
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/es/common/actions/rce.js +17 -0
- package/es/common/kinesis/config.js +3 -2
- package/es/common/kinesis/eventTypes.js +2 -1
- package/es/common/reducers/rce.js +19 -0
- package/es/common/selectors/rce.js +3 -0
- package/es/common/util/RceConfigProvider.js +53 -21
- package/es/common/util/serializeEvent.js +2 -2
- package/es/common/util/windowChecks.js +6 -0
- package/es/configureStore.js +3 -1
- package/es/index.js +2 -0
- package/lib/common/actions/rce.js +30 -0
- package/lib/common/kinesis/config.js +2 -1
- package/lib/common/kinesis/eventTypes.js +4 -2
- package/lib/common/reducers/rce.js +29 -0
- package/lib/common/selectors/rce.js +12 -0
- package/lib/common/util/RceConfigProvider.js +58 -20
- package/lib/common/util/serializeEvent.js +1 -1
- package/lib/common/util/windowChecks.js +11 -2
- package/lib/configureStore.js +4 -1
- package/lib/index.js +18 -0
- package/package.json +10 -10
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RCE_EVENT, SET_RCE_ERROR } from '@instructure/quiz-common';
|
|
2
|
+
export var setRCEError = function setRCEError(rceError) {
|
|
3
|
+
return {
|
|
4
|
+
type: SET_RCE_ERROR,
|
|
5
|
+
payload: rceError
|
|
6
|
+
};
|
|
7
|
+
}; // This is not consumed by its reducer
|
|
8
|
+
// Instead it is processed by the eventLoggerMiddleware
|
|
9
|
+
|
|
10
|
+
export var reportRCEEvent = function reportRCEEvent(eventMessage) {
|
|
11
|
+
return {
|
|
12
|
+
type: RCE_EVENT,
|
|
13
|
+
payload: {
|
|
14
|
+
message: eventMessage
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EVENT_RESPONSE, QUIZ_SUBMISSION_EVENT, RESPONSE, SESSION_STARTED_OR_RESUMED_EVENT } from "./eventTypes.js";
|
|
1
|
+
import { EVENT_RESPONSE, QUIZ_SUBMISSION_EVENT, RESPONSE, SESSION_STARTED_OR_RESUMED_EVENT, RCE_EVENT } from "./eventTypes.js";
|
|
2
2
|
export var assembleKinesisConfig = function assembleKinesisConfig(apiConfig) {
|
|
3
3
|
return Object.assign({
|
|
4
4
|
apiVersion: '2013-12-02'
|
|
@@ -19,7 +19,8 @@ export var eventStreamConfig = function eventStreamConfig(defaultStreamConfig, s
|
|
|
19
19
|
eventTypes: {
|
|
20
20
|
RESPONSE: EVENT_RESPONSE,
|
|
21
21
|
SESSION_STARTED_OR_RESUMED_EVENT: SESSION_STARTED_OR_RESUMED_EVENT,
|
|
22
|
-
QUIZ_SUBMISSION_EVENT: QUIZ_SUBMISSION_EVENT
|
|
22
|
+
QUIZ_SUBMISSION_EVENT: QUIZ_SUBMISSION_EVENT,
|
|
23
|
+
RCE_EVENT: RCE_EVENT
|
|
23
24
|
},
|
|
24
25
|
stream: stream
|
|
25
26
|
});
|
|
@@ -34,4 +34,5 @@ export var RESPONSE = eventType(function (data) {
|
|
|
34
34
|
});
|
|
35
35
|
export var EVENT_RESPONSE = eventType();
|
|
36
36
|
export var SESSION_STARTED_OR_RESUMED_EVENT = eventType();
|
|
37
|
-
export var QUIZ_SUBMISSION_EVENT = eventType();
|
|
37
|
+
export var QUIZ_SUBMISSION_EVENT = eventType();
|
|
38
|
+
export var RCE_EVENT = eventType();
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Map } from 'immutable';
|
|
2
|
+
import { SET_RCE_ERROR } from '@instructure/quiz-common';
|
|
3
|
+
|
|
4
|
+
var setRceError = function setRceError(state, payload) {
|
|
5
|
+
return state.set('rceError', payload);
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default (function () {
|
|
9
|
+
var state = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Map();
|
|
10
|
+
var action = arguments.length > 1 ? arguments[1] : void 0;
|
|
11
|
+
|
|
12
|
+
switch (action.type) {
|
|
13
|
+
case SET_RCE_ERROR:
|
|
14
|
+
return setRceError(state, action.payload);
|
|
15
|
+
|
|
16
|
+
default:
|
|
17
|
+
return state;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
@@ -6,14 +6,18 @@ import React, { useEffect, useState } from 'react';
|
|
|
6
6
|
import PropTypes from 'prop-types';
|
|
7
7
|
import { connect } from "../../common/react-redux.js";
|
|
8
8
|
import store from "../../reduxStore.js";
|
|
9
|
+
import { setRCEError } from "../actions/rce.js";
|
|
9
10
|
import isNewRCEEnabled from "./rceChecker.js";
|
|
10
11
|
import { QuizzesSpinner as Spinner } from "../components/shared/spinner/Spinner.js";
|
|
11
12
|
import { RceConfigContext, RceConfigKeys } from '@instructure/quiz-common';
|
|
12
13
|
import { addError } from "../actions/alerts.js";
|
|
14
|
+
import t from '@instructure/quiz-i18n/es/format-message';
|
|
15
|
+
import { extractTextFromHtml } from '@instructure/quiz-interactions';
|
|
16
|
+
import { isDuringQuizTake } from "./windowChecks.js";
|
|
13
17
|
|
|
14
18
|
var _ref4 = /*#__PURE__*/React.createElement(Spinner, null);
|
|
15
19
|
|
|
16
|
-
var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
20
|
+
export var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
17
21
|
var _useState = useState(props.rcsJwt),
|
|
18
22
|
_useState2 = _slicedToArray(_useState, 2),
|
|
19
23
|
jwt = _useState2[0],
|
|
@@ -37,7 +41,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
37
41
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(setTokenFn) {
|
|
38
42
|
var _response$json;
|
|
39
43
|
|
|
40
|
-
var response, refreshedToken;
|
|
44
|
+
var response, refreshedToken, stemPlaceholder, extractedText;
|
|
41
45
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
42
46
|
while (1) {
|
|
43
47
|
switch (_context.prev = _context.next) {
|
|
@@ -59,18 +63,24 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
59
63
|
refreshedToken = response === null || response === void 0 ? void 0 : (_response$json = response.json) === null || _response$json === void 0 ? void 0 : _response$json.token; // inst-redux-service-middleware response structure
|
|
60
64
|
|
|
61
65
|
if (refreshedToken) {
|
|
62
|
-
_context.next =
|
|
66
|
+
_context.next = 13;
|
|
63
67
|
break;
|
|
64
68
|
}
|
|
65
69
|
|
|
66
|
-
handleErrorFunc('Unable to refresh RCS token');
|
|
70
|
+
handleErrorFunc('Unable to refresh RCS token'); // TODO: provide question context for this function so it can actually get the question stem / instruction text
|
|
71
|
+
|
|
72
|
+
stemPlaceholder = 'Example question stem text';
|
|
73
|
+
extractedText = extractTextFromHtml(stemPlaceholder);
|
|
74
|
+
setErrorIfDuringTaking(t('Error while answering: {stem}: Full functionality of the Rich Content Editor may not have been available to the user.', {
|
|
75
|
+
stem: extractedText
|
|
76
|
+
}));
|
|
67
77
|
return _context.abrupt("return");
|
|
68
78
|
|
|
69
|
-
case
|
|
79
|
+
case 13:
|
|
70
80
|
setJwt(refreshedToken);
|
|
71
81
|
setTokenFn(refreshedToken);
|
|
72
82
|
|
|
73
|
-
case
|
|
83
|
+
case 15:
|
|
74
84
|
case "end":
|
|
75
85
|
return _context.stop();
|
|
76
86
|
}
|
|
@@ -96,6 +106,14 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
96
106
|
};
|
|
97
107
|
};
|
|
98
108
|
|
|
109
|
+
var setErrorIfDuringTaking = function setErrorIfDuringTaking(errorMessage) {
|
|
110
|
+
if (!isDuringQuizTake()) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
props.setRCEError(errorMessage);
|
|
115
|
+
};
|
|
116
|
+
|
|
99
117
|
useEffect(function () {
|
|
100
118
|
_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
101
119
|
var host, base, url, response, json;
|
|
@@ -105,7 +123,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
105
123
|
case 0:
|
|
106
124
|
_context2.prev = 0;
|
|
107
125
|
|
|
108
|
-
if (
|
|
126
|
+
if (props.useNewRce) {
|
|
109
127
|
_context2.next = 3;
|
|
110
128
|
break;
|
|
111
129
|
}
|
|
@@ -113,45 +131,56 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
113
131
|
return _context2.abrupt("return");
|
|
114
132
|
|
|
115
133
|
case 3:
|
|
134
|
+
if (hasAllPropsForRcs()) {
|
|
135
|
+
_context2.next = 6;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
setErrorIfDuringTaking(t('Error: Full functionality of the Rich Content Editor may not have been available to the user.'));
|
|
140
|
+
return _context2.abrupt("return");
|
|
141
|
+
|
|
142
|
+
case 6:
|
|
116
143
|
host = props.rcsHost;
|
|
117
144
|
base = host.match(/^https?:\/\//) ? host : "".concat(window.location.protocol, "//").concat(host);
|
|
118
145
|
url = new URL('/api/rceConfig', base);
|
|
119
146
|
url.searchParams.append('contextType', props.contextType);
|
|
120
147
|
url.searchParams.append('contextId', props.contextId);
|
|
121
|
-
_context2.next =
|
|
148
|
+
_context2.next = 13;
|
|
122
149
|
return fetch(url.href, {
|
|
123
150
|
headers: {
|
|
124
151
|
'Authorization': "Bearer ".concat(props.rcsJwt)
|
|
125
152
|
}
|
|
126
153
|
});
|
|
127
154
|
|
|
128
|
-
case
|
|
155
|
+
case 13:
|
|
129
156
|
response = _context2.sent;
|
|
130
|
-
_context2.next =
|
|
157
|
+
_context2.next = 16;
|
|
131
158
|
return response.json();
|
|
132
159
|
|
|
133
|
-
case
|
|
160
|
+
case 16:
|
|
134
161
|
json = _context2.sent;
|
|
135
162
|
setCanvasConfig(json);
|
|
136
|
-
|
|
163
|
+
setErrorIfDuringTaking(null);
|
|
164
|
+
_context2.next = 25;
|
|
137
165
|
break;
|
|
138
166
|
|
|
139
|
-
case
|
|
140
|
-
_context2.prev =
|
|
167
|
+
case 21:
|
|
168
|
+
_context2.prev = 21;
|
|
141
169
|
_context2.t0 = _context2["catch"](0);
|
|
142
170
|
setCanvasConfig(null);
|
|
171
|
+
setErrorIfDuringTaking(t('Error: Full functionality of the Rich Content Editor including accessibility features may not have been available to the user.'));
|
|
143
172
|
|
|
144
|
-
case
|
|
145
|
-
_context2.prev =
|
|
173
|
+
case 25:
|
|
174
|
+
_context2.prev = 25;
|
|
146
175
|
setCanvasConfigLoading(false);
|
|
147
|
-
return _context2.finish(
|
|
176
|
+
return _context2.finish(25);
|
|
148
177
|
|
|
149
|
-
case
|
|
178
|
+
case 28:
|
|
150
179
|
case "end":
|
|
151
180
|
return _context2.stop();
|
|
152
181
|
}
|
|
153
182
|
}
|
|
154
|
-
}, _callee2, null, [[0,
|
|
183
|
+
}, _callee2, null, [[0, 21, 25, 28]]);
|
|
155
184
|
}))();
|
|
156
185
|
}, [props.useNewRce]);
|
|
157
186
|
if (!props.useNewRce) return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
|
|
@@ -159,10 +188,10 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
159
188
|
value: getConfig()
|
|
160
189
|
}, props.children);
|
|
161
190
|
};
|
|
162
|
-
|
|
163
191
|
RceConfigProviderComponent.propTypes = {
|
|
164
192
|
children: PropTypes.node.isRequired,
|
|
165
193
|
useNewRce: PropTypes.bool.isRequired,
|
|
194
|
+
setRCEError: PropTypes.func.isRequired,
|
|
166
195
|
contextId: PropTypes.string,
|
|
167
196
|
contextType: PropTypes.string,
|
|
168
197
|
canvasUserId: PropTypes.string,
|
|
@@ -187,5 +216,8 @@ var mapStateToProps = function mapStateToProps() {
|
|
|
187
216
|
};
|
|
188
217
|
};
|
|
189
218
|
|
|
190
|
-
var
|
|
219
|
+
var mapDispatchToProps = {
|
|
220
|
+
setRCEError: setRCEError
|
|
221
|
+
};
|
|
222
|
+
var RceConfigProvider = connect(mapStateToProps, mapDispatchToProps)(RceConfigProviderComponent);
|
|
191
223
|
export { RceConfigProvider };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { QUIZ_SUBMISSION_EVENT, RESPONSE, SESSION_STARTED_OR_RESUMED_EVENT } from '@instructure/quiz-common';
|
|
1
|
+
import { QUIZ_SUBMISSION_EVENT, RESPONSE, SESSION_STARTED_OR_RESUMED_EVENT, RCE_EVENT } from '@instructure/quiz-common';
|
|
2
2
|
import { getBrowserSessionId } from "../selectors/taking.js";
|
|
3
3
|
import { getActiveQuizSession } from "../selectors/quizSessions.js";
|
|
4
|
-
var whitelist = [QUIZ_SUBMISSION_EVENT, RESPONSE, SESSION_STARTED_OR_RESUMED_EVENT];
|
|
4
|
+
var whitelist = [QUIZ_SUBMISSION_EVENT, RESPONSE, SESSION_STARTED_OR_RESUMED_EVENT, RCE_EVENT];
|
|
5
5
|
export function serializeEvent(action, store) {
|
|
6
6
|
var type = action.type;
|
|
7
7
|
|
|
@@ -11,4 +11,10 @@ export var onTablet = function onTablet() {
|
|
|
11
11
|
var windowObj = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window;
|
|
12
12
|
var mediaQueryString = media['tablet-break-point'];
|
|
13
13
|
return !onPhone(windowObj) && windowObj.matchMedia(mediaQueryString).matches;
|
|
14
|
+
};
|
|
15
|
+
export var isDuringQuizTake = function isDuringQuizTake() {
|
|
16
|
+
var windowObj = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window;
|
|
17
|
+
var locationPath = windowObj.location.pathname;
|
|
18
|
+
var patternOfQuizTakingPath = /taking\/\d+\/take/;
|
|
19
|
+
return !!locationPath.match(patternOfQuizTakingPath);
|
|
14
20
|
};
|
package/es/configureStore.js
CHANGED
|
@@ -44,6 +44,7 @@ import ui from "./common/reducers/ui.js";
|
|
|
44
44
|
import upload from "./common/reducers/upload.js";
|
|
45
45
|
import qtiImports from "./common/reducers/qtiImports.js";
|
|
46
46
|
import printing from "./common/reducers/printing.js";
|
|
47
|
+
import rce from "./common/reducers/rce.js";
|
|
47
48
|
import dragAndDrop from "./common/reducers/dragAndDrop.js";
|
|
48
49
|
import sharedBanks from "./common/reducers/sharedBanks.js";
|
|
49
50
|
export function configureStore(_ref) {
|
|
@@ -110,7 +111,8 @@ export function configureStore(_ref) {
|
|
|
110
111
|
tagAssociations: tagAssociations,
|
|
111
112
|
taking: taking,
|
|
112
113
|
ui: ui,
|
|
113
|
-
upload: upload
|
|
114
|
+
upload: upload,
|
|
115
|
+
rce: rce
|
|
114
116
|
});
|
|
115
117
|
return createStoreWithMiddlewareApplied(rootReducer, initialState);
|
|
116
118
|
}
|
package/es/index.js
CHANGED
|
@@ -113,6 +113,7 @@ export { showError, hideError, clearErrorsShowing } from "./common/actions/error
|
|
|
113
113
|
export { changeItemState, changeQuizEntryPoints, changeQuizEntryProperties, clearModifications, moveTemporaryQuizEntry, changeQuizOutcomeAlignmentSetGuid, changeFudgePoints, sessionItemResultsModification } from "./common/actions/modifications.js";
|
|
114
114
|
export { previousQuestion, editResponse, previewResponse, setCurrentSessionItemPosition, clearFocusCurrentSessionItem } from "./common/actions/taking.js";
|
|
115
115
|
export { scrollToItem } from "./common/actions/scrolling.js";
|
|
116
|
+
export { reportRCEEvent } from "./common/actions/rce.js";
|
|
116
117
|
export { toggleSidebar } from "./common/actions/sidebar.js";
|
|
117
118
|
export { newHoverPosition } from "./common/actions/dragAndDrop.js";
|
|
118
119
|
export { set, setActiveCalculatorId } from "./common/actions/ui.js";
|
|
@@ -129,6 +130,7 @@ export { getItemById } from "./common/selectors/items.js";
|
|
|
129
130
|
export { fileUploading } from "./common/selectors/calls.js";
|
|
130
131
|
export { isTimeUp, getTimerData, getResponseDataByPosition } from "./common/selectors/taking.js";
|
|
131
132
|
export { getActiveCalculatorId } from "./common/selectors/ui.js";
|
|
133
|
+
export { getRCEError } from "./common/selectors/rce.js";
|
|
132
134
|
export { getQuizSessionById, getActiveQuizSession, getBacktrackingIsAllowed, isOneQuestionAtATime } from "./common/selectors/quizSessions.js";
|
|
133
135
|
export { getGradingSessionItems } from "./common/selectors/sessionItems.js";
|
|
134
136
|
export { getGradingSessionItemResults } from "./common/selectors/sessionItemResults.js"; // Records
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.reportRCEEvent = exports.setRCEError = void 0;
|
|
7
|
+
|
|
8
|
+
var _quizCommon = require("@instructure/quiz-common");
|
|
9
|
+
|
|
10
|
+
var setRCEError = function setRCEError(rceError) {
|
|
11
|
+
return {
|
|
12
|
+
type: _quizCommon.SET_RCE_ERROR,
|
|
13
|
+
payload: rceError
|
|
14
|
+
};
|
|
15
|
+
}; // This is not consumed by its reducer
|
|
16
|
+
// Instead it is processed by the eventLoggerMiddleware
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
exports.setRCEError = setRCEError;
|
|
20
|
+
|
|
21
|
+
var reportRCEEvent = function reportRCEEvent(eventMessage) {
|
|
22
|
+
return {
|
|
23
|
+
type: _quizCommon.RCE_EVENT,
|
|
24
|
+
payload: {
|
|
25
|
+
message: eventMessage
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
exports.reportRCEEvent = reportRCEEvent;
|
|
@@ -33,7 +33,8 @@ var eventStreamConfig = function eventStreamConfig(defaultStreamConfig, stream)
|
|
|
33
33
|
eventTypes: {
|
|
34
34
|
RESPONSE: _eventTypes.EVENT_RESPONSE,
|
|
35
35
|
SESSION_STARTED_OR_RESUMED_EVENT: _eventTypes.SESSION_STARTED_OR_RESUMED_EVENT,
|
|
36
|
-
QUIZ_SUBMISSION_EVENT: _eventTypes.QUIZ_SUBMISSION_EVENT
|
|
36
|
+
QUIZ_SUBMISSION_EVENT: _eventTypes.QUIZ_SUBMISSION_EVENT,
|
|
37
|
+
RCE_EVENT: _eventTypes.RCE_EVENT
|
|
37
38
|
},
|
|
38
39
|
stream: stream
|
|
39
40
|
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.QUIZ_SUBMISSION_EVENT = exports.SESSION_STARTED_OR_RESUMED_EVENT = exports.EVENT_RESPONSE = exports.RESPONSE = void 0;
|
|
6
|
+
exports.RCE_EVENT = exports.QUIZ_SUBMISSION_EVENT = exports.SESSION_STARTED_OR_RESUMED_EVENT = exports.EVENT_RESPONSE = exports.RESPONSE = void 0;
|
|
7
7
|
|
|
8
8
|
var _humps = require("humps");
|
|
9
9
|
|
|
@@ -45,4 +45,6 @@ exports.EVENT_RESPONSE = EVENT_RESPONSE;
|
|
|
45
45
|
var SESSION_STARTED_OR_RESUMED_EVENT = eventType();
|
|
46
46
|
exports.SESSION_STARTED_OR_RESUMED_EVENT = SESSION_STARTED_OR_RESUMED_EVENT;
|
|
47
47
|
var QUIZ_SUBMISSION_EVENT = eventType();
|
|
48
|
-
exports.QUIZ_SUBMISSION_EVENT = QUIZ_SUBMISSION_EVENT;
|
|
48
|
+
exports.QUIZ_SUBMISSION_EVENT = QUIZ_SUBMISSION_EVENT;
|
|
49
|
+
var RCE_EVENT = eventType();
|
|
50
|
+
exports.RCE_EVENT = RCE_EVENT;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _immutable = require("immutable");
|
|
9
|
+
|
|
10
|
+
var _quizCommon = require("@instructure/quiz-common");
|
|
11
|
+
|
|
12
|
+
var setRceError = function setRceError(state, payload) {
|
|
13
|
+
return state.set('rceError', payload);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
var _default = function _default() {
|
|
17
|
+
var state = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : (0, _immutable.Map)();
|
|
18
|
+
var action = arguments.length > 1 ? arguments[1] : void 0;
|
|
19
|
+
|
|
20
|
+
switch (action.type) {
|
|
21
|
+
case _quizCommon.SET_RCE_ERROR:
|
|
22
|
+
return setRceError(state, action.payload);
|
|
23
|
+
|
|
24
|
+
default:
|
|
25
|
+
return state;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
exports.default = _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getRCEError = void 0;
|
|
7
|
+
|
|
8
|
+
var getRCEError = function getRCEError(state) {
|
|
9
|
+
return state.getIn(['rce', 'rceError'], null);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
exports.getRCEError = getRCEError;
|
|
@@ -7,7 +7,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
10
|
-
exports.RceConfigProvider = void 0;
|
|
10
|
+
exports.RceConfigProvider = exports.RceConfigProviderComponent = void 0;
|
|
11
11
|
|
|
12
12
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
13
|
|
|
@@ -25,6 +25,8 @@ var _reactRedux = require("../../common/react-redux.js");
|
|
|
25
25
|
|
|
26
26
|
var _reduxStore = _interopRequireDefault(require("../../reduxStore.js"));
|
|
27
27
|
|
|
28
|
+
var _rce = require("../actions/rce.js");
|
|
29
|
+
|
|
28
30
|
var _rceChecker = _interopRequireDefault(require("./rceChecker.js"));
|
|
29
31
|
|
|
30
32
|
var _Spinner = require("../components/shared/spinner/Spinner.js");
|
|
@@ -33,6 +35,12 @@ var _quizCommon = require("@instructure/quiz-common");
|
|
|
33
35
|
|
|
34
36
|
var _alerts = require("../actions/alerts.js");
|
|
35
37
|
|
|
38
|
+
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
|
|
39
|
+
|
|
40
|
+
var _quizInteractions = require("@instructure/quiz-interactions");
|
|
41
|
+
|
|
42
|
+
var _windowChecks = require("./windowChecks.js");
|
|
43
|
+
|
|
36
44
|
var _ref4 = /*#__PURE__*/_react.default.createElement(_Spinner.QuizzesSpinner, null);
|
|
37
45
|
|
|
38
46
|
var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
@@ -59,7 +67,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
59
67
|
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(setTokenFn) {
|
|
60
68
|
var _response$json;
|
|
61
69
|
|
|
62
|
-
var response, refreshedToken;
|
|
70
|
+
var response, refreshedToken, stemPlaceholder, extractedText;
|
|
63
71
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
64
72
|
while (1) {
|
|
65
73
|
switch (_context.prev = _context.next) {
|
|
@@ -81,18 +89,24 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
81
89
|
refreshedToken = response === null || response === void 0 ? void 0 : (_response$json = response.json) === null || _response$json === void 0 ? void 0 : _response$json.token; // inst-redux-service-middleware response structure
|
|
82
90
|
|
|
83
91
|
if (refreshedToken) {
|
|
84
|
-
_context.next =
|
|
92
|
+
_context.next = 13;
|
|
85
93
|
break;
|
|
86
94
|
}
|
|
87
95
|
|
|
88
|
-
handleErrorFunc('Unable to refresh RCS token');
|
|
96
|
+
handleErrorFunc('Unable to refresh RCS token'); // TODO: provide question context for this function so it can actually get the question stem / instruction text
|
|
97
|
+
|
|
98
|
+
stemPlaceholder = 'Example question stem text';
|
|
99
|
+
extractedText = (0, _quizInteractions.extractTextFromHtml)(stemPlaceholder);
|
|
100
|
+
setErrorIfDuringTaking((0, _formatMessage.default)('Error while answering: {stem}: Full functionality of the Rich Content Editor may not have been available to the user.', {
|
|
101
|
+
stem: extractedText
|
|
102
|
+
}));
|
|
89
103
|
return _context.abrupt("return");
|
|
90
104
|
|
|
91
|
-
case
|
|
105
|
+
case 13:
|
|
92
106
|
setJwt(refreshedToken);
|
|
93
107
|
setTokenFn(refreshedToken);
|
|
94
108
|
|
|
95
|
-
case
|
|
109
|
+
case 15:
|
|
96
110
|
case "end":
|
|
97
111
|
return _context.stop();
|
|
98
112
|
}
|
|
@@ -118,6 +132,14 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
118
132
|
};
|
|
119
133
|
};
|
|
120
134
|
|
|
135
|
+
var setErrorIfDuringTaking = function setErrorIfDuringTaking(errorMessage) {
|
|
136
|
+
if (!(0, _windowChecks.isDuringQuizTake)()) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
props.setRCEError(errorMessage);
|
|
141
|
+
};
|
|
142
|
+
|
|
121
143
|
(0, _react.useEffect)(function () {
|
|
122
144
|
(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
123
145
|
var host, base, url, response, json;
|
|
@@ -127,7 +149,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
127
149
|
case 0:
|
|
128
150
|
_context2.prev = 0;
|
|
129
151
|
|
|
130
|
-
if (
|
|
152
|
+
if (props.useNewRce) {
|
|
131
153
|
_context2.next = 3;
|
|
132
154
|
break;
|
|
133
155
|
}
|
|
@@ -135,45 +157,56 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
135
157
|
return _context2.abrupt("return");
|
|
136
158
|
|
|
137
159
|
case 3:
|
|
160
|
+
if (hasAllPropsForRcs()) {
|
|
161
|
+
_context2.next = 6;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
setErrorIfDuringTaking((0, _formatMessage.default)('Error: Full functionality of the Rich Content Editor may not have been available to the user.'));
|
|
166
|
+
return _context2.abrupt("return");
|
|
167
|
+
|
|
168
|
+
case 6:
|
|
138
169
|
host = props.rcsHost;
|
|
139
170
|
base = host.match(/^https?:\/\//) ? host : "".concat(window.location.protocol, "//").concat(host);
|
|
140
171
|
url = new URL('/api/rceConfig', base);
|
|
141
172
|
url.searchParams.append('contextType', props.contextType);
|
|
142
173
|
url.searchParams.append('contextId', props.contextId);
|
|
143
|
-
_context2.next =
|
|
174
|
+
_context2.next = 13;
|
|
144
175
|
return fetch(url.href, {
|
|
145
176
|
headers: {
|
|
146
177
|
'Authorization': "Bearer ".concat(props.rcsJwt)
|
|
147
178
|
}
|
|
148
179
|
});
|
|
149
180
|
|
|
150
|
-
case
|
|
181
|
+
case 13:
|
|
151
182
|
response = _context2.sent;
|
|
152
|
-
_context2.next =
|
|
183
|
+
_context2.next = 16;
|
|
153
184
|
return response.json();
|
|
154
185
|
|
|
155
|
-
case
|
|
186
|
+
case 16:
|
|
156
187
|
json = _context2.sent;
|
|
157
188
|
setCanvasConfig(json);
|
|
158
|
-
|
|
189
|
+
setErrorIfDuringTaking(null);
|
|
190
|
+
_context2.next = 25;
|
|
159
191
|
break;
|
|
160
192
|
|
|
161
|
-
case
|
|
162
|
-
_context2.prev =
|
|
193
|
+
case 21:
|
|
194
|
+
_context2.prev = 21;
|
|
163
195
|
_context2.t0 = _context2["catch"](0);
|
|
164
196
|
setCanvasConfig(null);
|
|
197
|
+
setErrorIfDuringTaking((0, _formatMessage.default)('Error: Full functionality of the Rich Content Editor including accessibility features may not have been available to the user.'));
|
|
165
198
|
|
|
166
|
-
case
|
|
167
|
-
_context2.prev =
|
|
199
|
+
case 25:
|
|
200
|
+
_context2.prev = 25;
|
|
168
201
|
setCanvasConfigLoading(false);
|
|
169
|
-
return _context2.finish(
|
|
202
|
+
return _context2.finish(25);
|
|
170
203
|
|
|
171
|
-
case
|
|
204
|
+
case 28:
|
|
172
205
|
case "end":
|
|
173
206
|
return _context2.stop();
|
|
174
207
|
}
|
|
175
208
|
}
|
|
176
|
-
}, _callee2, null, [[0,
|
|
209
|
+
}, _callee2, null, [[0, 21, 25, 28]]);
|
|
177
210
|
}))();
|
|
178
211
|
}, [props.useNewRce]);
|
|
179
212
|
if (!props.useNewRce) return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children);
|
|
@@ -182,9 +215,11 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
|
|
|
182
215
|
}, props.children);
|
|
183
216
|
};
|
|
184
217
|
|
|
218
|
+
exports.RceConfigProviderComponent = RceConfigProviderComponent;
|
|
185
219
|
RceConfigProviderComponent.propTypes = {
|
|
186
220
|
children: _propTypes.default.node.isRequired,
|
|
187
221
|
useNewRce: _propTypes.default.bool.isRequired,
|
|
222
|
+
setRCEError: _propTypes.default.func.isRequired,
|
|
188
223
|
contextId: _propTypes.default.string,
|
|
189
224
|
contextType: _propTypes.default.string,
|
|
190
225
|
canvasUserId: _propTypes.default.string,
|
|
@@ -209,5 +244,8 @@ var mapStateToProps = function mapStateToProps() {
|
|
|
209
244
|
};
|
|
210
245
|
};
|
|
211
246
|
|
|
212
|
-
var
|
|
247
|
+
var mapDispatchToProps = {
|
|
248
|
+
setRCEError: _rce.setRCEError
|
|
249
|
+
};
|
|
250
|
+
var RceConfigProvider = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(RceConfigProviderComponent);
|
|
213
251
|
exports.RceConfigProvider = RceConfigProvider;
|
|
@@ -12,7 +12,7 @@ var _taking = require("../selectors/taking.js");
|
|
|
12
12
|
|
|
13
13
|
var _quizSessions = require("../selectors/quizSessions.js");
|
|
14
14
|
|
|
15
|
-
var whitelist = [_quizCommon.QUIZ_SUBMISSION_EVENT, _quizCommon.RESPONSE, _quizCommon.SESSION_STARTED_OR_RESUMED_EVENT];
|
|
15
|
+
var whitelist = [_quizCommon.QUIZ_SUBMISSION_EVENT, _quizCommon.RESPONSE, _quizCommon.SESSION_STARTED_OR_RESUMED_EVENT, _quizCommon.RCE_EVENT];
|
|
16
16
|
|
|
17
17
|
function serializeEvent(action, store) {
|
|
18
18
|
var type = action.type;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.onTablet = exports.onPhone = exports.media = void 0;
|
|
6
|
+
exports.isDuringQuizTake = exports.onTablet = exports.onPhone = exports.media = void 0;
|
|
7
7
|
var media = {
|
|
8
8
|
'phone-break-point': 'only screen and (max-width: 48rem)',
|
|
9
9
|
'tablet-break-point': 'only screen and (max-width: 64rem)'
|
|
@@ -24,4 +24,13 @@ var onTablet = function onTablet() {
|
|
|
24
24
|
return !onPhone(windowObj) && windowObj.matchMedia(mediaQueryString).matches;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
exports.onTablet = onTablet;
|
|
27
|
+
exports.onTablet = onTablet;
|
|
28
|
+
|
|
29
|
+
var isDuringQuizTake = function isDuringQuizTake() {
|
|
30
|
+
var windowObj = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window;
|
|
31
|
+
var locationPath = windowObj.location.pathname;
|
|
32
|
+
var patternOfQuizTakingPath = /taking\/\d+\/take/;
|
|
33
|
+
return !!locationPath.match(patternOfQuizTakingPath);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.isDuringQuizTake = isDuringQuizTake;
|
package/lib/configureStore.js
CHANGED
|
@@ -96,6 +96,8 @@ var _qtiImports = _interopRequireDefault(require("./common/reducers/qtiImports.j
|
|
|
96
96
|
|
|
97
97
|
var _printing = _interopRequireDefault(require("./common/reducers/printing.js"));
|
|
98
98
|
|
|
99
|
+
var _rce = _interopRequireDefault(require("./common/reducers/rce.js"));
|
|
100
|
+
|
|
99
101
|
var _dragAndDrop = _interopRequireDefault(require("./common/reducers/dragAndDrop.js"));
|
|
100
102
|
|
|
101
103
|
var _sharedBanks = _interopRequireDefault(require("./common/reducers/sharedBanks.js"));
|
|
@@ -166,7 +168,8 @@ function configureStore(_ref) {
|
|
|
166
168
|
tagAssociations: _tagAssociations.default,
|
|
167
169
|
taking: _taking.default,
|
|
168
170
|
ui: _ui.default,
|
|
169
|
-
upload: _upload.default
|
|
171
|
+
upload: _upload.default,
|
|
172
|
+
rce: _rce.default
|
|
170
173
|
});
|
|
171
174
|
return createStoreWithMiddlewareApplied(rootReducer, initialState);
|
|
172
175
|
}
|
package/lib/index.js
CHANGED
|
@@ -166,6 +166,7 @@ var _exportNames = {
|
|
|
166
166
|
clearFocusCurrentSessionItem: true,
|
|
167
167
|
takingActionCreators: true,
|
|
168
168
|
scrollToItem: true,
|
|
169
|
+
reportRCEEvent: true,
|
|
169
170
|
toggleSidebar: true,
|
|
170
171
|
newHoverPosition: true,
|
|
171
172
|
set: true,
|
|
@@ -186,6 +187,7 @@ var _exportNames = {
|
|
|
186
187
|
getTimerData: true,
|
|
187
188
|
getResponseDataByPosition: true,
|
|
188
189
|
getActiveCalculatorId: true,
|
|
190
|
+
getRCEError: true,
|
|
189
191
|
getQuizSessionById: true,
|
|
190
192
|
getActiveQuizSession: true,
|
|
191
193
|
getBacktrackingIsAllowed: true,
|
|
@@ -1135,6 +1137,12 @@ Object.defineProperty(exports, "scrollToItem", {
|
|
|
1135
1137
|
return _scrolling.scrollToItem;
|
|
1136
1138
|
}
|
|
1137
1139
|
});
|
|
1140
|
+
Object.defineProperty(exports, "reportRCEEvent", {
|
|
1141
|
+
enumerable: true,
|
|
1142
|
+
get: function get() {
|
|
1143
|
+
return _rce.reportRCEEvent;
|
|
1144
|
+
}
|
|
1145
|
+
});
|
|
1138
1146
|
Object.defineProperty(exports, "toggleSidebar", {
|
|
1139
1147
|
enumerable: true,
|
|
1140
1148
|
get: function get() {
|
|
@@ -1255,6 +1263,12 @@ Object.defineProperty(exports, "getActiveCalculatorId", {
|
|
|
1255
1263
|
return _ui2.getActiveCalculatorId;
|
|
1256
1264
|
}
|
|
1257
1265
|
});
|
|
1266
|
+
Object.defineProperty(exports, "getRCEError", {
|
|
1267
|
+
enumerable: true,
|
|
1268
|
+
get: function get() {
|
|
1269
|
+
return _rce2.getRCEError;
|
|
1270
|
+
}
|
|
1271
|
+
});
|
|
1258
1272
|
Object.defineProperty(exports, "getQuizSessionById", {
|
|
1259
1273
|
enumerable: true,
|
|
1260
1274
|
get: function get() {
|
|
@@ -1509,6 +1523,8 @@ exports.takingActionCreators = takingActionCreators;
|
|
|
1509
1523
|
|
|
1510
1524
|
var _scrolling = require("./common/actions/scrolling.js");
|
|
1511
1525
|
|
|
1526
|
+
var _rce = require("./common/actions/rce.js");
|
|
1527
|
+
|
|
1512
1528
|
var _sidebar = require("./common/actions/sidebar.js");
|
|
1513
1529
|
|
|
1514
1530
|
var _dragAndDrop = require("./common/actions/dragAndDrop.js");
|
|
@@ -1529,6 +1545,8 @@ var _taking3 = require("./common/selectors/taking.js");
|
|
|
1529
1545
|
|
|
1530
1546
|
var _ui2 = require("./common/selectors/ui.js");
|
|
1531
1547
|
|
|
1548
|
+
var _rce2 = require("./common/selectors/rce.js");
|
|
1549
|
+
|
|
1532
1550
|
var _quizSessions4 = require("./common/selectors/quizSessions.js");
|
|
1533
1551
|
|
|
1534
1552
|
var _sessionItems = require("./common/selectors/sessionItems.js");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instructure/quiz-core",
|
|
3
|
-
"version": "17.41.1-rc.
|
|
3
|
+
"version": "17.41.1-rc.16+345bca5e1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "The Quiz React SDK by Instructure Inc.",
|
|
6
6
|
"author": "Instructure, Inc. Engineering and Product Design",
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
],
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@instructure/outcomes-ui": "^2.1.2",
|
|
44
|
-
"@instructure/quiz-common": "17.41.1-rc.
|
|
45
|
-
"@instructure/quiz-i18n": "17.41.1-rc.
|
|
46
|
-
"@instructure/quiz-interactions": "17.41.1-rc.
|
|
47
|
-
"@instructure/quiz-number-input": "17.41.1-rc.
|
|
48
|
-
"@instructure/quiz-rce": "17.41.1-rc.
|
|
44
|
+
"@instructure/quiz-common": "17.41.1-rc.16+345bca5e1",
|
|
45
|
+
"@instructure/quiz-i18n": "17.41.1-rc.16+345bca5e1",
|
|
46
|
+
"@instructure/quiz-interactions": "17.41.1-rc.16+345bca5e1",
|
|
47
|
+
"@instructure/quiz-number-input": "17.41.1-rc.16+345bca5e1",
|
|
48
|
+
"@instructure/quiz-rce": "17.41.1-rc.16+345bca5e1",
|
|
49
49
|
"@instructure/ui-a11y-content": "^7.20.0",
|
|
50
50
|
"@instructure/ui-alerts": "^7.20.0",
|
|
51
51
|
"@instructure/ui-avatar": "^7.20.0",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"eventemitter3": "^3.1.0",
|
|
107
107
|
"humps": "^2.0.0",
|
|
108
108
|
"immutable": "^3.8.1",
|
|
109
|
-
"instructure-validations": "17.41.1-rc.
|
|
109
|
+
"instructure-validations": "17.41.1-rc.16+345bca5e1",
|
|
110
110
|
"ipaddr.js": "^1.5.4",
|
|
111
111
|
"isomorphic-fetch": "^2.2.0",
|
|
112
112
|
"isuuid": "^0.1.0",
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
"uuid": "^3.2.1"
|
|
138
138
|
},
|
|
139
139
|
"devDependencies": {
|
|
140
|
-
"@instructure/quiz-scripts": "17.41.1-rc.
|
|
140
|
+
"@instructure/quiz-scripts": "17.41.1-rc.16+345bca5e1",
|
|
141
141
|
"@instructure/ui-axe-check": "^7.20.0",
|
|
142
142
|
"@instructure/ui-babel-preset": "^7.20.0",
|
|
143
143
|
"@instructure/ui-karma-config": "^7.20.0",
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
"intl": "^1.2.4",
|
|
157
157
|
"jquery": "^2.2.3",
|
|
158
158
|
"most-subject": "^5.3.0",
|
|
159
|
-
"quiz-presets": "17.41.1-rc.
|
|
159
|
+
"quiz-presets": "17.41.1-rc.16+345bca5e1",
|
|
160
160
|
"react": "^16.8.6",
|
|
161
161
|
"react-addons-test-utils": "^15.6.2",
|
|
162
162
|
"react-dom": "^16.8.6",
|
|
@@ -172,5 +172,5 @@
|
|
|
172
172
|
"publishConfig": {
|
|
173
173
|
"access": "public"
|
|
174
174
|
},
|
|
175
|
-
"gitHead": "
|
|
175
|
+
"gitHead": "345bca5e191666a67e63ab33c454c971fef8d01e"
|
|
176
176
|
}
|