@instructure/quiz-core 22.10.2 → 22.11.1

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 (43) hide show
  1. package/es/banks/api/banks.js +18 -97
  2. package/es/banks/components/SharingModal/index.js +6 -3
  3. package/es/banks/components/SharingModal/presenter.js +207 -131
  4. package/es/building/api/items.js +120 -24
  5. package/es/building/api/quizEntries.js +78 -15
  6. package/es/building/components/resources/quizEntry/QuizEntryShow/presenter.js +11 -2
  7. package/es/common/actions/sharedBanks.js +13 -1
  8. package/es/common/actions/sharingModal.js +7 -0
  9. package/es/common/components/resources/quiz/AddContent/Body/index.js +1 -1
  10. package/es/common/components/resources/quiz/AddContent/Body/presenter.js +129 -141
  11. package/es/common/components/resources/quiz/AddContent/Modal/presenter.js +59 -72
  12. package/es/common/components/resources/quiz/AddContent/Popover/presenter.js +126 -119
  13. package/es/common/components/shared/InteractionTypes/index.js +1 -4
  14. package/es/common/components/shared/InteractionTypes/presenter.js +1 -3
  15. package/es/common/middleware/sharedBanksMiddleware.js +243 -0
  16. package/es/common/records/Item.js +2 -1
  17. package/es/common/records/QuizEntry.js +7 -0
  18. package/es/common/reducers/sharingModal.js +17 -0
  19. package/es/common/util/useRemoteComponent.js +127 -0
  20. package/es/configureStore.js +4 -1
  21. package/es/index.js +3 -2
  22. package/lib/banks/api/banks.js +17 -96
  23. package/lib/banks/components/SharingModal/index.js +5 -2
  24. package/lib/banks/components/SharingModal/presenter.js +205 -129
  25. package/lib/building/api/items.js +120 -23
  26. package/lib/building/api/quizEntries.js +78 -14
  27. package/lib/building/components/resources/quizEntry/QuizEntryShow/presenter.js +10 -1
  28. package/lib/common/actions/sharedBanks.js +13 -1
  29. package/lib/common/actions/sharingModal.js +13 -0
  30. package/lib/common/components/resources/quiz/AddContent/Body/index.js +1 -1
  31. package/lib/common/components/resources/quiz/AddContent/Body/presenter.js +132 -141
  32. package/lib/common/components/resources/quiz/AddContent/Modal/presenter.js +59 -74
  33. package/lib/common/components/resources/quiz/AddContent/Popover/presenter.js +127 -119
  34. package/lib/common/components/shared/InteractionTypes/index.js +1 -4
  35. package/lib/common/components/shared/InteractionTypes/presenter.js +1 -3
  36. package/lib/common/middleware/sharedBanksMiddleware.js +250 -0
  37. package/lib/common/records/Item.js +2 -1
  38. package/lib/common/records/QuizEntry.js +7 -0
  39. package/lib/common/reducers/sharingModal.js +23 -0
  40. package/lib/common/util/useRemoteComponent.js +134 -0
  41. package/lib/configureStore.js +4 -1
  42. package/lib/index.js +22 -0
  43. package/package.json +8 -8
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useRemoteComponent = useRemoteComponent;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _react = require("react");
12
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
13
+ // @ts-check
14
+
15
+ /**
16
+ * Custom hook to load and render a remote component asynchronously.
17
+ *
18
+ * @param {() => Promise<{
19
+ * render: (container: HTMLElement, props: unknown) => void,
20
+ * unmount?: () => void
21
+ * }>} loadRemoteModule - A function that returns a promise resolving to the remote component module
22
+ * @param {unknown | undefined} props - Props to pass to the remote component when rendering
23
+ * @param {boolean} enabled - Whether the remote component should be loaded and rendered
24
+ *
25
+ * @returns {{
26
+ * containerRef: React.MutableRefObject<HTMLDivElement | null>,
27
+ * componentActivityState: 'idle' | 'pending' | 'success' | 'error',
28
+ * componentError: Error | null,
29
+ * unmount: () => void
30
+ * }} An object containing the container ref and unmount function
31
+ */
32
+ function useRemoteComponent(loadRemoteModule, props) {
33
+ var enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
34
+ var mountCancelled = (0, _react.useRef)(false);
35
+ var _useState = (0, _react.useState)(/** @type {'idle' | 'pending' | 'success' | 'error'} */'idle'),
36
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
37
+ componentActivityState = _useState2[0],
38
+ setComponentActivityState = _useState2[1];
39
+ var _useState3 = (0, _react.useState)(/** @type {Error | null} */null),
40
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
41
+ componentError = _useState4[0],
42
+ setComponentError = _useState4[1];
43
+
44
+ /**
45
+ * @type {React.MutableRefObject<{
46
+ * render: (container: HTMLElement, props: unknown) => void,
47
+ * unmount?: () => void
48
+ * } | null>}
49
+ */
50
+ var remoteModuleRef = (0, _react.useRef)(null);
51
+
52
+ /**
53
+ * @type {React.MutableRefObject<HTMLDivElement | null>}
54
+ */
55
+ var containerRef = (0, _react.useRef)(null);
56
+
57
+ // Note: This workflow can be converted to a TanStack Query hook in the future.
58
+ (0, _react.useEffect)(function () {
59
+ if (loadRemoteModule == null || !enabled || componentActivityState === 'error') {
60
+ return;
61
+ }
62
+ mountCancelled.current = false;
63
+ setComponentActivityState('idle');
64
+ function loadModule() {
65
+ return _loadModule.apply(this, arguments);
66
+ }
67
+ function _loadModule() {
68
+ _loadModule = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
69
+ var module;
70
+ return _regenerator["default"].wrap(function _callee$(_context) {
71
+ while (1) switch (_context.prev = _context.next) {
72
+ case 0:
73
+ _context.prev = 0;
74
+ if (!remoteModuleRef.current) {
75
+ _context.next = 4;
76
+ break;
77
+ }
78
+ setComponentActivityState('success');
79
+ return _context.abrupt("return", remoteModuleRef.current);
80
+ case 4:
81
+ setComponentActivityState('pending');
82
+ _context.next = 7;
83
+ return loadRemoteModule();
84
+ case 7:
85
+ module = _context.sent;
86
+ setComponentActivityState('success');
87
+ return _context.abrupt("return", module);
88
+ case 12:
89
+ _context.prev = 12;
90
+ _context.t0 = _context["catch"](0);
91
+ setComponentActivityState('error');
92
+ setComponentError(new Error((0, _formatMessage["default"])('Failed to load remote module: {error}', {
93
+ error: _context.t0
94
+ })));
95
+ case 16:
96
+ case "end":
97
+ return _context.stop();
98
+ }
99
+ }, _callee, null, [[0, 12]]);
100
+ }));
101
+ return _loadModule.apply(this, arguments);
102
+ }
103
+ loadModule().then(function (module) {
104
+ if (module) {
105
+ remoteModuleRef.current = module;
106
+ }
107
+ var container = containerRef.current;
108
+ if (container == null || module == null || mountCancelled.current) {
109
+ return;
110
+ }
111
+ module.render(container, props);
112
+ });
113
+ return function () {
114
+ mountCancelled.current = true;
115
+ };
116
+ }, [loadRemoteModule, props, enabled]);
117
+ var unmount = (0, _react.useCallback)(function () {
118
+ var _module$unmount;
119
+ if (mountCancelled.current || !containerRef.current) {
120
+ return;
121
+ }
122
+ var module = remoteModuleRef.current;
123
+ if (!module) {
124
+ return;
125
+ }
126
+ (_module$unmount = module.unmount) === null || _module$unmount === void 0 || _module$unmount.call(module);
127
+ }, []);
128
+ return {
129
+ containerRef: containerRef,
130
+ componentActivityState: componentActivityState,
131
+ componentError: componentError,
132
+ unmount: unmount
133
+ };
134
+ }
@@ -17,6 +17,7 @@ var _alertTimerMiddleware = _interopRequireDefault(require("./common/middleware/
17
17
  var _crossDomainMessagingMiddleware = _interopRequireDefault(require("./common/middleware/crossDomainMessagingMiddleware"));
18
18
  var _eventLoggerMiddleware = _interopRequireDefault(require("./common/middleware/eventLoggerMiddleware"));
19
19
  var _quizTimerWebSocketMiddleware = require("./common/middleware/quizTimerWebSocketMiddleware");
20
+ var _sharedBanksMiddleware = require("./common/middleware/sharedBanksMiddleware");
20
21
  var _alerts = _interopRequireDefault(require("./common/reducers/alerts"));
21
22
  var _banks = _interopRequireDefault(require("./common/reducers/banks"));
22
23
  var _bankEntries = _interopRequireDefault(require("./common/reducers/bankEntries"));
@@ -54,6 +55,7 @@ var _qtiImports = _interopRequireDefault(require("./common/reducers/qtiImports")
54
55
  var _printing = _interopRequireDefault(require("./common/reducers/printing"));
55
56
  var _rce = _interopRequireDefault(require("./common/reducers/rce"));
56
57
  var _analyses = _interopRequireDefault(require("./common/reducers/analyses"));
58
+ var _sharingModal = _interopRequireDefault(require("./common/reducers/sharingModal"));
57
59
  var _dragAndDrop = _interopRequireDefault(require("./common/reducers/dragAndDrop"));
58
60
  var _sharedBanks = _interopRequireDefault(require("./common/reducers/sharedBanks"));
59
61
  // middleware
@@ -85,7 +87,7 @@ function configureStore(_ref) {
85
87
  var getMiddleware = function getMiddleware(implementation, override) {
86
88
  return isTest && override ? override : implementation;
87
89
  };
88
- var middlewares = [getMiddleware(_alertTimerMiddleware["default"], middlewareOverrides.alertTimerMiddleware), getMiddleware(_crossDomainMessagingMiddleware["default"], middlewareOverrides.crossDomainMessagingMiddleware), getMiddleware(_reduxMulti["default"], middlewareOverrides.multiMiddleware), getMiddleware((0, _eventLoggerMiddleware["default"])(), middlewareOverrides.kinesisMiddleware), getMiddleware(_reduxThunk["default"], middlewareOverrides.thunkMiddleware), getMiddleware((0, _quizTimerWebSocketMiddleware.createQuizTimerWebSocketMiddleware)(), middlewareOverrides.websocketMiddleware)];
90
+ var middlewares = [getMiddleware(_alertTimerMiddleware["default"], middlewareOverrides.alertTimerMiddleware), getMiddleware(_crossDomainMessagingMiddleware["default"], middlewareOverrides.crossDomainMessagingMiddleware), getMiddleware(_reduxMulti["default"], middlewareOverrides.multiMiddleware), getMiddleware((0, _eventLoggerMiddleware["default"])(), middlewareOverrides.kinesisMiddleware), getMiddleware(_reduxThunk["default"], middlewareOverrides.thunkMiddleware), getMiddleware((0, _quizTimerWebSocketMiddleware.createQuizTimerWebSocketMiddleware)(), middlewareOverrides.websocketMiddleware), getMiddleware((0, _sharedBanksMiddleware.createSharedBanksMiddleware)(), middlewareOverrides.sharedBanksMiddleware)];
89
91
  var devMiddleware = [getMiddleware(loggerMiddleware, middlewareOverrides.logger)];
90
92
  if (inDevelopment) {
91
93
  middlewares.push.apply(middlewares, devMiddleware);
@@ -106,6 +108,7 @@ function configureStore(_ref) {
106
108
  banks: _banks["default"],
107
109
  bankEntries: _bankEntries["default"],
108
110
  sharedBanks: _sharedBanks["default"],
111
+ sharingModal: _sharingModal["default"],
109
112
  calls: _calls["default"],
110
113
  config: _config["default"],
111
114
  editing: _editing["default"],
package/lib/index.js CHANGED
@@ -111,6 +111,7 @@ var _exportNames = {
111
111
  printWithCss: true,
112
112
  ensureImagesLoaded: true,
113
113
  ensureRCEContentIsLoaded: true,
114
+ useRemoteComponent: true,
114
115
  applyComponentStyleOverride: true,
115
116
  withStyleOverrides: true,
116
117
  getThemeByKey: true,
@@ -121,7 +122,9 @@ var _exportNames = {
121
122
  createQuizEntryRegrade: true,
122
123
  getQuizEntry: true,
123
124
  moveQuizEntry: true,
125
+ createBulkQuizEntries: true,
124
126
  getItem: true,
127
+ createBulkItems: true,
125
128
  interactionFileUpload: true,
126
129
  setOneAtATimeType: true,
127
130
  quizBuildingSession: true,
@@ -816,6 +819,18 @@ Object.defineProperty(exports, "connect", {
816
819
  return _reactRedux.connect;
817
820
  }
818
821
  });
822
+ Object.defineProperty(exports, "createBulkItems", {
823
+ enumerable: true,
824
+ get: function get() {
825
+ return _items.createBulkItems;
826
+ }
827
+ });
828
+ Object.defineProperty(exports, "createBulkQuizEntries", {
829
+ enumerable: true,
830
+ get: function get() {
831
+ return _quizEntries.createBulkQuizEntries;
832
+ }
833
+ });
819
834
  Object.defineProperty(exports, "createQuizEntryRegrade", {
820
835
  enumerable: true,
821
836
  get: function get() {
@@ -1490,6 +1505,12 @@ Object.defineProperty(exports, "unsetFeatures", {
1490
1505
  return _featureCheck.unsetFeatures;
1491
1506
  }
1492
1507
  });
1508
+ Object.defineProperty(exports, "useRemoteComponent", {
1509
+ enumerable: true,
1510
+ get: function get() {
1511
+ return _useRemoteComponent.useRemoteComponent;
1512
+ }
1513
+ });
1493
1514
  Object.defineProperty(exports, "withStyleOverrides", {
1494
1515
  enumerable: true,
1495
1516
  get: function get() {
@@ -1598,6 +1619,7 @@ var _ElementsForSelectors = require("./common/util/ElementsForSelectors");
1598
1619
  var _sessionStore = require("./common/util/sessionStore");
1599
1620
  var _printUtils = require("./common/util/printUtils");
1600
1621
  var _rceChecker = require("./common/util/rceChecker");
1622
+ var _useRemoteComponent = require("./common/util/useRemoteComponent");
1601
1623
  var _quizCommon = require("@instructure/quiz-common");
1602
1624
  var _getClientIpAddress = require("./common/util/getClientIpAddress");
1603
1625
  var _quizEntryRegrades = require("./grading/api/quizEntryRegrades");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "22.10.2",
3
+ "version": "22.11.1",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -111,12 +111,12 @@
111
111
  "store": "^1.3.20",
112
112
  "striptags": "^2.0.0",
113
113
  "uuid": "^3.2.1",
114
- "@instructure/quiz-common": "22.10.2",
115
- "@instructure/quiz-number-input": "22.10.2",
116
- "@instructure/quiz-i18n": "22.10.2",
117
- "@instructure/quiz-interactions": "22.10.2",
118
- "instructure-validations": "22.10.2",
119
- "@instructure/quiz-rce": "22.10.2"
114
+ "@instructure/quiz-i18n": "22.11.1",
115
+ "@instructure/quiz-interactions": "22.11.1",
116
+ "@instructure/quiz-common": "22.11.1",
117
+ "@instructure/quiz-number-input": "22.11.1",
118
+ "@instructure/quiz-rce": "22.11.1",
119
+ "instructure-validations": "22.11.1"
120
120
  },
121
121
  "devDependencies": {
122
122
  "@instructure/ui-axe-check": "10.17.0",
@@ -145,7 +145,7 @@
145
145
  "sinon": "^6.1.3",
146
146
  "sinon-chai": "^3.3.0",
147
147
  "@instructure/quiz-scripts": "21.0.0",
148
- "quiz-presets": "22.10.2"
148
+ "quiz-presets": "22.11.1"
149
149
  },
150
150
  "peerDependencies": {
151
151
  "react": "^15 || ^16"