@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.
@@ -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
+ });
@@ -0,0 +1,3 @@
1
+ export var getRCEError = function getRCEError(state) {
2
+ return state.getIn(['rce', 'rceError'], null);
3
+ };
@@ -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 = 10;
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 10:
79
+ case 13:
70
80
  setJwt(refreshedToken);
71
81
  setTokenFn(refreshedToken);
72
82
 
73
- case 12:
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 (!(!props.useNewRce || !hasAllPropsForRcs())) {
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 = 10;
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 10:
155
+ case 13:
129
156
  response = _context2.sent;
130
- _context2.next = 13;
157
+ _context2.next = 16;
131
158
  return response.json();
132
159
 
133
- case 13:
160
+ case 16:
134
161
  json = _context2.sent;
135
162
  setCanvasConfig(json);
136
- _context2.next = 20;
163
+ setErrorIfDuringTaking(null);
164
+ _context2.next = 25;
137
165
  break;
138
166
 
139
- case 17:
140
- _context2.prev = 17;
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 20:
145
- _context2.prev = 20;
173
+ case 25:
174
+ _context2.prev = 25;
146
175
  setCanvasConfigLoading(false);
147
- return _context2.finish(20);
176
+ return _context2.finish(25);
148
177
 
149
- case 23:
178
+ case 28:
150
179
  case "end":
151
180
  return _context2.stop();
152
181
  }
153
182
  }
154
- }, _callee2, null, [[0, 17, 20, 23]]);
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 RceConfigProvider = connect(mapStateToProps)(RceConfigProviderComponent);
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
  };
@@ -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 = 10;
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 10:
105
+ case 13:
92
106
  setJwt(refreshedToken);
93
107
  setTokenFn(refreshedToken);
94
108
 
95
- case 12:
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 (!(!props.useNewRce || !hasAllPropsForRcs())) {
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 = 10;
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 10:
181
+ case 13:
151
182
  response = _context2.sent;
152
- _context2.next = 13;
183
+ _context2.next = 16;
153
184
  return response.json();
154
185
 
155
- case 13:
186
+ case 16:
156
187
  json = _context2.sent;
157
188
  setCanvasConfig(json);
158
- _context2.next = 20;
189
+ setErrorIfDuringTaking(null);
190
+ _context2.next = 25;
159
191
  break;
160
192
 
161
- case 17:
162
- _context2.prev = 17;
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 20:
167
- _context2.prev = 20;
199
+ case 25:
200
+ _context2.prev = 25;
168
201
  setCanvasConfigLoading(false);
169
- return _context2.finish(20);
202
+ return _context2.finish(25);
170
203
 
171
- case 23:
204
+ case 28:
172
205
  case "end":
173
206
  return _context2.stop();
174
207
  }
175
208
  }
176
- }, _callee2, null, [[0, 17, 20, 23]]);
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 RceConfigProvider = (0, _reactRedux.connect)(mapStateToProps)(RceConfigProviderComponent);
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;
@@ -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.14+82298d433",
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.14+82298d433",
45
- "@instructure/quiz-i18n": "17.41.1-rc.14+82298d433",
46
- "@instructure/quiz-interactions": "17.41.1-rc.14+82298d433",
47
- "@instructure/quiz-number-input": "17.41.1-rc.14+82298d433",
48
- "@instructure/quiz-rce": "17.41.1-rc.14+82298d433",
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.14+82298d433",
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.14+82298d433",
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.14+82298d433",
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": "82298d4336c3f8cbbb8d4059c2b4460e13f65d56"
175
+ "gitHead": "345bca5e191666a67e63ab33c454c971fef8d01e"
176
176
  }