@instructure/quiz-core 17.46.2-rc.7 → 17.47.1-rc.0

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/es/banks/components/AddToBankModal/index.js +6 -0
  3. package/es/banks/components/AddToBankModal/presenter.js +128 -6
  4. package/es/banks/components/BankEntry/presenter.js +4 -3
  5. package/es/building/api/items.js +21 -5
  6. package/es/building/api/stimuli.js +21 -5
  7. package/es/building/components/resources/quizEntry/QuizEntryEdit/presenter.js +1 -0
  8. package/es/common/actions/config.js +7 -1
  9. package/es/common/components/ApiFeatureFlagInitializer/index.js +36 -0
  10. package/es/common/components/ConfirmationModal/presenter.js +1 -1
  11. package/es/common/{util → components/RceConfigProvider}/RceConfigProvider.js +66 -51
  12. package/es/common/components/SDKApp/index.js +14 -7
  13. package/es/common/components/resources/entry/EntrySave/index.js +11 -5
  14. package/es/common/components/resources/entry/EntrySave/presenter.js +95 -21
  15. package/es/common/components/resources/stimulus/StimulusEdit/presenter.js +1 -0
  16. package/es/common/reducers/config.js +4 -1
  17. package/es/common/util/rceChecker.js +1 -1
  18. package/es/common/util/windowChecks.js +4 -1
  19. package/lib/banks/components/AddToBankModal/index.js +9 -0
  20. package/lib/banks/components/AddToBankModal/presenter.js +135 -6
  21. package/lib/banks/components/BankEntry/presenter.js +4 -3
  22. package/lib/building/api/items.js +23 -5
  23. package/lib/building/api/stimuli.js +23 -5
  24. package/lib/building/components/resources/quizEntry/QuizEntryEdit/presenter.js +1 -0
  25. package/lib/common/actions/config.js +8 -0
  26. package/lib/common/components/ApiFeatureFlagInitializer/index.js +53 -0
  27. package/lib/common/components/ConfirmationModal/presenter.js +1 -1
  28. package/lib/common/{util → components/RceConfigProvider}/RceConfigProvider.js +66 -51
  29. package/lib/common/components/SDKApp/index.js +17 -10
  30. package/lib/common/components/resources/entry/EntrySave/index.js +15 -2
  31. package/lib/common/components/resources/entry/EntrySave/presenter.js +96 -21
  32. package/lib/common/components/resources/stimulus/StimulusEdit/presenter.js +1 -0
  33. package/lib/common/reducers/config.js +3 -0
  34. package/lib/common/util/rceChecker.js +1 -1
  35. package/lib/common/util/windowChecks.js +8 -2
  36. package/package.json +10 -10
@@ -21,27 +21,27 @@ var _react = _interopRequireWildcard(require("react"));
21
21
 
22
22
  var _propTypes = _interopRequireDefault(require("prop-types"));
23
23
 
24
- var _reactRedux = require("../../common/react-redux.js");
24
+ var _reactRedux = require("../../react-redux.js");
25
25
 
26
- var _reduxStore = _interopRequireDefault(require("../../reduxStore.js"));
26
+ var _reduxStore = _interopRequireDefault(require("../../../reduxStore.js"));
27
27
 
28
- var _rce = require("../actions/rce.js");
28
+ var _rce = require("../../actions/rce.js");
29
29
 
30
- var _rceChecker = require("./rceChecker.js");
30
+ var _rceChecker = require("../../util/rceChecker.js");
31
31
 
32
- var _Spinner = require("../components/shared/spinner/Spinner.js");
32
+ var _Spinner = require("../shared/spinner/Spinner.js");
33
33
 
34
- var _index = require("../components/shared/Card/index.js");
34
+ var _index = require("../shared/Card/index.js");
35
35
 
36
36
  var _quizCommon = require("@instructure/quiz-common");
37
37
 
38
- var _alerts = require("../actions/alerts.js");
38
+ var _alerts = require("../../actions/alerts.js");
39
39
 
40
40
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
41
41
 
42
42
  var _quizInteractions = require("@instructure/quiz-interactions");
43
43
 
44
- var _windowChecks = require("./windowChecks.js");
44
+ var _windowChecks = require("../../util/windowChecks.js");
45
45
 
46
46
  var _ref4 = /*#__PURE__*/_react.default.createElement(_index.Card, {
47
47
  wrapped: true
@@ -67,6 +67,10 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
67
67
  return !!(props.contextId && props.contextType && props.canvasUserId && props.rcsHost && props.rcsJwtRefreshFn && props.rcsJwt);
68
68
  };
69
69
 
70
+ var isRce5Disabled = function isRce5Disabled() {
71
+ return !props.isNewRCEEnabled && !props.rce5Renderer;
72
+ };
73
+
70
74
  var refreshToken = /*#__PURE__*/function () {
71
75
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(setTokenFn, questionStem) {
72
76
  var _response$json;
@@ -77,39 +81,37 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
77
81
  switch (_context.prev = _context.next) {
78
82
  case 0:
79
83
  if (hasAllPropsForRcs()) {
80
- _context.next = 3;
84
+ _context.next = 2;
81
85
  break;
82
86
  }
83
87
 
84
- handleErrorFunc('Invalid RCS configuration');
85
88
  return _context.abrupt("return");
86
89
 
87
- case 3:
88
- _context.next = 5;
90
+ case 2:
91
+ _context.next = 4;
89
92
  return props.rcsJwtRefreshFn(jwt);
90
93
 
91
- case 5:
94
+ case 4:
92
95
  response = _context.sent;
93
96
  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
94
97
 
95
98
  if (refreshedToken) {
96
- _context.next = 13;
99
+ _context.next = 11;
97
100
  break;
98
101
  }
99
102
 
100
- handleErrorFunc('Unable to refresh RCS token');
101
103
  normalizedStem = questionStem !== null && questionStem !== void 0 ? questionStem : 'Unknown stem';
102
104
  extractedText = (0, _quizInteractions.extractTextFromHtml)(normalizedStem);
103
- setErrorIfDuringTaking((0, _formatMessage.default)('Error while answering "{stem}": Full functionality of the Rich Content Editor may not have been available to the user.', {
105
+ handleError((0, _formatMessage.default)('Error while answering "{stem}": Full functionality of the Rich Content Editor may not have been available to the user.', {
104
106
  stem: extractedText
105
107
  }));
106
108
  return _context.abrupt("return");
107
109
 
108
- case 13:
110
+ case 11:
109
111
  setJwt(refreshedToken);
110
112
  setTokenFn(refreshedToken);
111
113
 
112
- case 15:
114
+ case 13:
113
115
  case "end":
114
116
  return _context.stop();
115
117
  }
@@ -122,8 +124,34 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
122
124
  };
123
125
  }();
124
126
 
125
- var handleErrorFunc = function handleErrorFunc(errorMessage) {
126
- _reduxStore.default.dispatch((0, _alerts.addError)(errorMessage));
127
+ var handleError = function handleError(quizLogMessage) {
128
+ if (shouldAlertUser()) {
129
+ alertTheUser(alertMessage());
130
+ }
131
+
132
+ if (shouldsetEventToQuizLog()) {
133
+ setEventToQuizLog(quizLogMessage);
134
+ }
135
+ };
136
+
137
+ var alertTheUser = function alertTheUser(message) {
138
+ _reduxStore.default.dispatch((0, _alerts.addError)(message));
139
+ };
140
+
141
+ var setEventToQuizLog = function setEventToQuizLog(message) {
142
+ props.setEventToQuizLog(message);
143
+ };
144
+
145
+ var alertMessage = function alertMessage() {
146
+ return (0, _windowChecks.isQuizTaking)() ? (0, _formatMessage.default)('The Rich Content Editor has encountered an issue. ' + 'It has been logged for your instructor to review. Please refresh and try again.') : (0, _formatMessage.default)('The Rich Content Editor has encountered an issue. Please refresh and try again.');
147
+ };
148
+
149
+ var shouldAlertUser = function shouldAlertUser() {
150
+ return (0, _windowChecks.isQuizTaking)() || (0, _windowChecks.isQuizBuilding)();
151
+ };
152
+
153
+ var shouldsetEventToQuizLog = function shouldsetEventToQuizLog() {
154
+ return (0, _windowChecks.isQuizTaking)();
127
155
  };
128
156
 
129
157
  var getConfig = function getConfig() {
@@ -136,14 +164,6 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
136
164
  };
137
165
  };
138
166
 
139
- var setErrorIfDuringTaking = function setErrorIfDuringTaking(errorMessage) {
140
- if (!(0, _windowChecks.isQuizTaking)()) {
141
- return;
142
- }
143
-
144
- props.setRCEError(errorMessage);
145
- };
146
-
147
167
  (0, _react.useEffect)(function () {
148
168
  (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
149
169
  var host, base, url, response, json;
@@ -151,7 +171,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
151
171
  while (1) {
152
172
  switch (_context2.prev = _context2.next) {
153
173
  case 0:
154
- if (!(!props.isNewRCEEnabled && !props.rce5Renderer)) {
174
+ if (!isRce5Disabled()) {
155
175
  _context2.next = 2;
156
176
  break;
157
177
  }
@@ -166,7 +186,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
166
186
  break;
167
187
  }
168
188
 
169
- setErrorIfDuringTaking((0, _formatMessage.default)('Error: Full functionality of the Rich Content Editor may not have been available to the user.'));
189
+ handleError((0, _formatMessage.default)('Error: Full functionality of the Rich Content Editor may not have been available to the user.'));
170
190
  return _context2.abrupt("return");
171
191
 
172
192
  case 6:
@@ -190,7 +210,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
190
210
  case 16:
191
211
  json = _context2.sent;
192
212
  setCanvasConfig(json);
193
- setErrorIfDuringTaking(null);
213
+ setEventToQuizLog(null);
194
214
  _context2.next = 25;
195
215
  break;
196
216
 
@@ -198,7 +218,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
198
218
  _context2.prev = 21;
199
219
  _context2.t0 = _context2["catch"](2);
200
220
  setCanvasConfig(null);
201
- setErrorIfDuringTaking((0, _formatMessage.default)('Error: Full functionality of the Rich Content Editor including accessibility features may not have been available to the user.'));
221
+ handleError((0, _formatMessage.default)('Error: Full functionality of the Rich Content Editor including accessibility features may not have been available to the user.'));
202
222
 
203
223
  case 25:
204
224
  _context2.prev = 25;
@@ -214,19 +234,17 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(props) {
214
234
  }))();
215
235
  }, [props.isNewRCEEnabled, props.rce5Renderer]);
216
236
 
217
- if (props.loadedApiFeatures) {
218
- if (props.isNewRCEEnabled || props.rce5Renderer) {
219
- if (!canvasConfigLoading) {
220
- return /*#__PURE__*/_react.default.createElement(_quizCommon.RceConfigContext.Provider, {
221
- value: getConfig()
222
- }, props.children);
223
- }
224
- } else {
225
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children);
226
- }
237
+ if (isRce5Disabled()) {
238
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children);
227
239
  }
228
240
 
229
- return _ref4;
241
+ if (!canvasConfigLoading) {
242
+ return /*#__PURE__*/_react.default.createElement(_quizCommon.RceConfigContext.Provider, {
243
+ value: getConfig()
244
+ }, props.children);
245
+ } else {
246
+ return _ref4;
247
+ }
230
248
  };
231
249
 
232
250
  exports.RceConfigProviderComponent = RceConfigProviderComponent;
@@ -235,15 +253,14 @@ RceConfigProviderComponent.propTypes = {
235
253
  isNewRCEEnabled: _propTypes.default.bool.isRequired,
236
254
  rce5Renderer: _propTypes.default.bool.isRequired,
237
255
  isNewRCEAppsEnabled: _propTypes.default.bool,
238
- setRCEError: _propTypes.default.func.isRequired,
256
+ setEventToQuizLog: _propTypes.default.func.isRequired,
239
257
  contextId: _propTypes.default.string,
240
258
  contextType: _propTypes.default.string,
241
259
  canvasUserId: _propTypes.default.string,
242
260
  rcsHost: _propTypes.default.string,
243
261
  rcsJwt: _propTypes.default.string,
244
262
  rcsJwtRefreshFn: _propTypes.default.func,
245
- canvasOrigin: _propTypes.default.string,
246
- loadedApiFeatures: _propTypes.default.bool
263
+ canvasOrigin: _propTypes.default.string
247
264
  };
248
265
  RceConfigProviderComponent.defaultProps = {
249
266
  contextId: null,
@@ -253,21 +270,19 @@ RceConfigProviderComponent.defaultProps = {
253
270
  rcsJwt: null,
254
271
  rcsJwtRefreshFn: null,
255
272
  canvasOrigin: null,
256
- loadedApiFeatures: false,
257
273
  isNewRCEAppsEnabled: false
258
274
  };
259
275
 
260
- var mapStateToProps = function mapStateToProps(state, ownProps) {
276
+ var mapStateToProps = function mapStateToProps() {
261
277
  return {
262
278
  isNewRCEEnabled: (0, _rceChecker.isNewRCEEnabled)(),
263
279
  rce5Renderer: (0, _rceChecker.isRCE5RendererEnabled)(),
264
- isNewRCEAppsEnabled: (0, _rceChecker.isNewRCEAppsEnabled)(),
265
- loadedApiFeatures: state.getIn(['ui', 'loadedApiFeatures']) || ownProps.loadedApiFeatures
280
+ isNewRCEAppsEnabled: (0, _rceChecker.isNewRCEAppsEnabled)()
266
281
  };
267
282
  };
268
283
 
269
284
  var mapDispatchToProps = {
270
- setRCEError: _rce.setRCEError
285
+ setEventToQuizLog: _rce.setRCEError
271
286
  };
272
287
  var RceConfigProvider = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(RceConfigProviderComponent);
273
288
  exports.RceConfigProvider = RceConfigProvider;
@@ -35,15 +35,13 @@ var _reduxStore = _interopRequireDefault(require("../../../reduxStore.js"));
35
35
 
36
36
  var _quizCommon = require("@instructure/quiz-common");
37
37
 
38
- var _features = require("../../api/features.js");
39
-
40
38
  var _ui = require("../../actions/ui.js");
41
39
 
42
40
  var _config = require("../../actions/config.js");
43
41
 
44
42
  var _outcomes = require("../../actions/outcomes.js");
45
43
 
46
- var _features2 = require("../../actions/features.js");
44
+ var _features = require("../../actions/features.js");
47
45
 
48
46
  var _renderAlerts = _interopRequireDefault(require("../../util/renderAlerts.js"));
49
47
 
@@ -55,7 +53,9 @@ var _index = _interopRequireDefault(require("../ConfirmationModal/index.js"));
55
53
 
56
54
  var _setupFormatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/util/setupFormatMessage"));
57
55
 
58
- var _RceConfigProvider = require("../../util/RceConfigProvider.js");
56
+ var _RceConfigProvider = require("../RceConfigProvider/RceConfigProvider.js");
57
+
58
+ var _index2 = require("../ApiFeatureFlagInitializer/index.js");
59
59
 
60
60
  var _dec, _class, _class2, _temp;
61
61
 
@@ -108,11 +108,12 @@ var SDKApp = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_
108
108
  }, {
109
109
  key: "componentWillMount",
110
110
  value: function componentWillMount() {
111
- this.store.dispatch([(0, _config.setAPIEndpoint)(this.props.apiEndpoint), this.setAppContainer(this.props.appContainer), (0, _config.setUserToken)(this.props.userToken), (0, _outcomes.setOutcomesEndpoint)(this.props.outcomesEndpoint), (0, _outcomes.setOutcomesToken)(this.props.outcomesToken), (0, _outcomes.setContextUuid)(this.props.contextUuid)]);
112
- this.store.dispatch((0, _features.getFeatures)());
111
+ var _this$props$rceConfig;
112
+
113
+ this.store.dispatch([(0, _config.setAPIEndpoint)(this.props.apiEndpoint), (0, _config.setCanvasOrigin)((_this$props$rceConfig = this.props.rceConfig) === null || _this$props$rceConfig === void 0 ? void 0 : _this$props$rceConfig.canvasOrigin), this.setAppContainer(this.props.appContainer), (0, _config.setUserToken)(this.props.userToken), (0, _outcomes.setOutcomesEndpoint)(this.props.outcomesEndpoint), (0, _outcomes.setOutcomesToken)(this.props.outcomesToken), (0, _outcomes.setContextUuid)(this.props.contextUuid)]);
113
114
 
114
115
  if (this.props.itemBankSharingEnabled) {
115
- this.store.dispatch((0, _features2.addFeatures)('item_bank_sharing'));
116
+ this.store.dispatch((0, _features.addFeatures)('item_bank_sharing'));
116
117
  }
117
118
  }
118
119
  }, {
@@ -125,10 +126,16 @@ var SDKApp = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_
125
126
  }, {
126
127
  key: "componentWillReceiveProps",
127
128
  value: function componentWillReceiveProps(newProps) {
129
+ var _newProps$rceConfig, _this$props$rceConfig2;
130
+
128
131
  if (newProps.apiEndpoint !== this.props.apiEndpoint) {
129
132
  this.store.dispatch((0, _config.setAPIEndpoint)(newProps.apiEndpoint));
130
133
  }
131
134
 
135
+ if (((_newProps$rceConfig = newProps.rceConfig) === null || _newProps$rceConfig === void 0 ? void 0 : _newProps$rceConfig.canvasOrigin) !== ((_this$props$rceConfig2 = this.props.rceConfig) === null || _this$props$rceConfig2 === void 0 ? void 0 : _this$props$rceConfig2.canvasOrigin)) {
136
+ this.store.dispatch((0, _config.setCanvasOrigin)(newProps.rceConfig.canvasOrigin));
137
+ }
138
+
132
139
  if (newProps.appContainer !== this.props.appContainer) {
133
140
  this.store.dispatch(this.setAppContainer(newProps.appContainer));
134
141
  }
@@ -150,7 +157,7 @@ var SDKApp = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_
150
157
  }
151
158
 
152
159
  if (newProps.itemBankSharingEnabled !== this.props.itemBankSharingEnabled) {
153
- var toggleFeature = newProps.itemBankSharingEnabled ? _features2.addFeatures : _features2.removeFeatures;
160
+ var toggleFeature = newProps.itemBankSharingEnabled ? _features.addFeatures : _features.removeFeatures;
154
161
  this.store.dispatch(toggleFeature('item_bank_sharing'));
155
162
  }
156
163
  }
@@ -162,13 +169,13 @@ var SDKApp = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_
162
169
  context = this.context;
163
170
  return /*#__PURE__*/_react.default.createElement(_reactRedux.Provider, {
164
171
  store: store
165
- }, /*#__PURE__*/_react.default.createElement(_RceConfigProvider.RceConfigProvider, this.props.rceConfig, /*#__PURE__*/_react.default.createElement(_uiI18n.ApplyLocale, {
172
+ }, /*#__PURE__*/_react.default.createElement(_index2.ApiFeatureFlagInitializer, null, /*#__PURE__*/_react.default.createElement(_RceConfigProvider.RceConfigProvider, this.props.rceConfig, /*#__PURE__*/_react.default.createElement(_uiI18n.ApplyLocale, {
166
173
  locale: (0, _quizCommon.getLocale)(props, context),
167
174
  timezone: props.timeZone
168
175
  }, /*#__PURE__*/_react.default.createElement("div", {
169
176
  className: styles.sdk,
170
177
  "data-automation": "sdk-app"
171
- }, _ref, props.children))));
178
+ }, _ref, props.children)))));
172
179
  }
173
180
  }]);
174
181
  SDKApp.displayName = "SDKApp";
@@ -5,10 +5,15 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.mapStateToProps = mapStateToProps;
8
9
  exports.default = void 0;
9
10
 
10
11
  var _reactRedux = require("../../../../react-redux.js");
11
12
 
13
+ var _items = require("../../../../../building/api/items.js");
14
+
15
+ var _stimuli = require("../../../../../building/api/stimuli.js");
16
+
12
17
  var _makeEditable = _interopRequireDefault(require("../../../shared/functionality/makeEditable.js"));
13
18
 
14
19
  var _errorsShowing = require("../../../../actions/errorsShowing.js");
@@ -17,6 +22,10 @@ var _alerts = require("../../../../actions/alerts.js");
17
22
 
18
23
  var _modifications = require("../../../../actions/modifications.js");
19
24
 
25
+ var _modal = require("../../../../actions/modal.js");
26
+
27
+ var _featureCheck = require("../../../../util/featureCheck.js");
28
+
20
29
  var _presenter = _interopRequireDefault(require("./presenter.js"));
21
30
 
22
31
  function mapStateToProps(state, props) {
@@ -24,15 +33,19 @@ function mapStateToProps(state, props) {
24
33
  var workingEntry = props.entry.getWorkingInstance();
25
34
  var isValid = props.isValid !== void 0 ? props.isValid : workingEntry.isValid();
26
35
  return {
36
+ canvasOrigin: state.getIn(['config', 'canvasOrigin']),
37
+ checkBankedContentShareabilityEnabled: (0, _featureCheck.featureOn)('check_banked_content_shareability'),
38
+ checkContentShareability: props.entry.isStimulus ? _stimuli.checkStimulusShareability : _items.checkItemShareability,
27
39
  isValid: isValid
28
40
  };
29
41
  }
30
42
 
31
43
  var mapDispatchToProps = {
32
44
  clearNextQuizEntry: _modifications.clearNextQuizEntry,
33
- showError: _errorsShowing.showError,
34
45
  hideError: _errorsShowing.hideError,
35
- screenreaderNotification: _alerts.screenreaderNotification
46
+ screenreaderNotification: _alerts.screenreaderNotification,
47
+ showError: _errorsShowing.showError,
48
+ withConfirm: _modal.withConfirm
36
49
  };
37
50
 
38
51
  var _default = (0, _makeEditable.default)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_presenter.default));
@@ -25,6 +25,8 @@ var _react = _interopRequireWildcard(require("react"));
25
25
 
26
26
  var _propTypes = _interopRequireDefault(require("prop-types"));
27
27
 
28
+ var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes"));
29
+
28
30
  var _uiButtons = require("@instructure/ui-buttons");
29
31
 
30
32
  var _uiView = require("@instructure/ui-view");
@@ -63,11 +65,75 @@ var EntrySave = /*#__PURE__*/function (_Component) {
63
65
  _this.props.screenreaderNotification(msg);
64
66
  };
65
67
 
68
+ _this.confirmShareableContent = function () {
69
+ var _this$props = _this.props,
70
+ canvasOrigin = _this$props.canvasOrigin,
71
+ checkContentShareability = _this$props.checkContentShareability,
72
+ entry = _this$props.entry,
73
+ withConfirm = _this$props.withConfirm;
74
+
75
+ _this.setState({
76
+ canSubmit: false
77
+ });
78
+
79
+ checkContentShareability(entry.getWorkingInstance(), canvasOrigin).then(function () {
80
+ _this.successfulSubmit();
81
+ }).catch( /*#__PURE__*/function () {
82
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(err) {
83
+ var _err$response, _err$response2;
84
+
85
+ var body, text;
86
+ return _regenerator.default.wrap(function _callee$(_context) {
87
+ while (1) {
88
+ switch (_context.prev = _context.next) {
89
+ case 0:
90
+ _context.next = 2;
91
+ return (_err$response = err.response) === null || _err$response === void 0 ? void 0 : _err$response.json();
92
+
93
+ case 2:
94
+ body = _context.sent;
95
+ text = (0, _formatMessage.default)('There was an error attempting to validate shareability.');
96
+
97
+ if (((_err$response2 = err.response) === null || _err$response2 === void 0 ? void 0 : _err$response2.status) === 400 && body.shareable === false) {
98
+ text = (0, _formatMessage.default)('You are attempting to save content containing course links which may not work when used in other courses.');
99
+ }
100
+
101
+ withConfirm(function () {
102
+ _this.successfulSubmit();
103
+ }, {
104
+ title: (0, _formatMessage.default)('Are you sure?'),
105
+ text: text,
106
+ continueText: (0, _formatMessage.default)('Save anyway'),
107
+ onCancel: function onCancel() {
108
+ _this.setState({
109
+ canSubmit: true
110
+ });
111
+ }
112
+ });
113
+
114
+ case 6:
115
+ case "end":
116
+ return _context.stop();
117
+ }
118
+ }
119
+ }, _callee);
120
+ }));
121
+
122
+ return function (_x) {
123
+ return _ref.apply(this, arguments);
124
+ };
125
+ }());
126
+ };
127
+
66
128
  _this.onSubmit = function (e) {
67
129
  e.preventDefault();
68
130
 
69
131
  if (_this.props.isValid) {
70
- _this.successfulSubmit();
132
+ if (_this.props.checkBankedContentShareabilityEnabled && _this.props.shouldValidateShareableContent) {
133
+ _this.confirmShareableContent();
134
+ } else {
135
+ _this.successfulSubmit();
136
+ }
71
137
  } else {
72
138
  _this.createScreenReaderNotification();
73
139
 
@@ -111,24 +177,24 @@ var EntrySave = /*#__PURE__*/function (_Component) {
111
177
  }, {
112
178
  key: "successfulSubmit",
113
179
  value: function () {
114
- var _successfulSubmit = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
180
+ var _successfulSubmit = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
115
181
  var validationResult;
116
- return _regenerator.default.wrap(function _callee$(_context) {
182
+ return _regenerator.default.wrap(function _callee2$(_context2) {
117
183
  while (1) {
118
- switch (_context.prev = _context.next) {
184
+ switch (_context2.prev = _context2.next) {
119
185
  case 0:
120
186
  this.setState({
121
187
  canSubmit: false
122
188
  });
123
- _context.prev = 1;
124
- _context.next = 4;
189
+ _context2.prev = 1;
190
+ _context2.next = 4;
125
191
  return this.props.submitHandler();
126
192
 
127
193
  case 4:
128
- validationResult = _context.sent;
194
+ validationResult = _context2.sent;
129
195
 
130
196
  if (!(validationResult === _quizCommon.API_INPUT_VALIDATION_ERROR)) {
131
- _context.next = 8;
197
+ _context2.next = 8;
132
198
  break;
133
199
  }
134
200
 
@@ -136,16 +202,16 @@ var EntrySave = /*#__PURE__*/function (_Component) {
136
202
  throw new Error('User input validation error received from API.');
137
203
 
138
204
  case 8:
139
- _context.next = 14;
205
+ _context2.next = 14;
140
206
  break;
141
207
 
142
208
  case 10:
143
- _context.prev = 10;
144
- _context.t0 = _context["catch"](1);
209
+ _context2.prev = 10;
210
+ _context2.t0 = _context2["catch"](1);
145
211
  this.setState({
146
212
  canSubmit: true
147
213
  });
148
- return _context.abrupt("return");
214
+ return _context2.abrupt("return");
149
215
 
150
216
  case 14:
151
217
  this.props.switchOffEditing();
@@ -154,10 +220,10 @@ var EntrySave = /*#__PURE__*/function (_Component) {
154
220
 
155
221
  case 17:
156
222
  case "end":
157
- return _context.stop();
223
+ return _context2.stop();
158
224
  }
159
225
  }
160
- }, _callee, this, [[1, 10]]);
226
+ }, _callee2, this, [[1, 10]]);
161
227
  }));
162
228
 
163
229
  function successfulSubmit() {
@@ -193,29 +259,38 @@ var EntrySave = /*#__PURE__*/function (_Component) {
193
259
 
194
260
  exports.EntrySave = EntrySave;
195
261
  EntrySave.propTypes = {
196
- displayPosition: _propTypes.default.number,
197
- disableSubmit: _propTypes.default.bool,
198
- guid: _propTypes.default.string,
199
- submitHandler: _propTypes.default.func.isRequired,
200
262
  cancelHandler: _propTypes.default.func,
263
+ canvasOrigin: _propTypes.default.string,
264
+ checkBankedContentShareabilityEnabled: _propTypes.default.bool,
265
+ checkContentShareability: _propTypes.default.func.isRequired,
201
266
  clearChanges: _propTypes.default.func.isRequired,
202
267
  // From connected component
203
268
  clearNextQuizEntry: _propTypes.default.func.isRequired,
269
+ disableSubmit: _propTypes.default.bool,
270
+ displayPosition: _propTypes.default.number,
271
+ entry: _reactImmutableProptypes.default.record.isRequired,
272
+ guid: _propTypes.default.string,
204
273
  hideError: _propTypes.default.func.isRequired,
274
+ initialFocusId: _propTypes.default.string,
205
275
  isValid: _propTypes.default.bool.isRequired,
206
276
  showError: _propTypes.default.func.isRequired,
207
277
  screenreaderNotification: _propTypes.default.func.isRequired,
278
+ shouldValidateShareableContent: _propTypes.default.bool,
279
+ submitHandler: _propTypes.default.func.isRequired,
208
280
  // from makescrollable / from props being passed in occasionally
209
281
  switchOnEditing: _propTypes.default.func.isRequired,
210
282
  switchOffEditing: _propTypes.default.func.isRequired,
211
- initialFocusId: _propTypes.default.string
283
+ withConfirm: _propTypes.default.func.isRequired
212
284
  };
213
285
  EntrySave.defaultProps = {
214
- displayPosition: null,
215
286
  cancelHandler: _noop.default,
287
+ canvasOrigin: '',
288
+ checkBankedContentShareabilityEnabled: false,
289
+ displayPosition: null,
216
290
  disableSubmit: false,
217
291
  guid: null,
218
- initialFocusId: null
292
+ initialFocusId: null,
293
+ shouldValidateShareableContent: false
219
294
  };
220
295
  var _default = EntrySave;
221
296
  exports.default = _default;
@@ -413,6 +413,7 @@ var StimulusEdit = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
413
413
  onAdd: this.handleAddToBank,
414
414
  onContinue: this.handleAddToBankContinue,
415
415
  getEntry: this.getEntryForBank,
416
+ workingEntry: this.props.workingStimulus,
416
417
  entryId: this.props.guid,
417
418
  entryType: this.props.quizEntry.entryType
418
419
  });
@@ -21,6 +21,9 @@ var _default = function _default() {
21
21
  case _quizCommon.SET_API_ENDPOINT:
22
22
  return state.set('apiEndpoint', action.payload);
23
23
 
24
+ case _quizCommon.SET_CANVAS_ORIGIN:
25
+ return state.set('canvasOrigin', action.payload);
26
+
24
27
  case _quizCommon.SET_USER_TOKEN:
25
28
  return state.set('userToken', action.payload);
26
29
 
@@ -11,7 +11,7 @@ exports.default = void 0;
11
11
  var _featureCheck = require("./featureCheck.js");
12
12
 
13
13
  var newRCEFeatureName = 'use_new_rce';
14
- var newRCEAppsFeatureName = 'use_new_rce_apps';
14
+ var newRCEAppsFeatureName = 'rce5_apps';
15
15
  var rce5RendererFeatureName = 'rce5_renderer';
16
16
 
17
17
  function isNewRCEEnabled() {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isQuizTaking = exports.onTablet = exports.onPhone = exports.media = void 0;
6
+ exports.isQuizBuilding = exports.isQuizTaking = exports.onTablet = exports.onPhone = exports.media = void 0;
7
7
 
8
8
  var _quizCommon = require("@instructure/quiz-common");
9
9
 
@@ -33,4 +33,10 @@ var isQuizTaking = function isQuizTaking() {
33
33
  return (0, _quizCommon.isDuringQuizTake)();
34
34
  };
35
35
 
36
- exports.isQuizTaking = isQuizTaking;
36
+ exports.isQuizTaking = isQuizTaking;
37
+
38
+ var isQuizBuilding = function isQuizBuilding() {
39
+ return (0, _quizCommon.isDuringQuizBuild)();
40
+ };
41
+
42
+ exports.isQuizBuilding = isQuizBuilding;