@instructure/quiz-core 17.63.1-rc.1 → 17.63.1-rc.4

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 (23) hide show
  1. package/es/common/actions/analyses.js +7 -1
  2. package/es/common/components/shared/spinner/Spinner.js +33 -18
  3. package/es/common/components/shared/spinner/theme.js +2 -5
  4. package/es/common/reducers/analyses.js +10 -8
  5. package/es/common/selectors/analyses.js +3 -0
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +80 -30
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +4 -2
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/fetchReports.js +15 -12
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/fetchReportsStatus.js +45 -0
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +10 -4
  11. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +53 -13
  12. package/lib/common/actions/analyses.js +8 -0
  13. package/lib/common/components/shared/spinner/Spinner.js +34 -19
  14. package/lib/common/components/shared/spinner/theme.js +2 -5
  15. package/lib/common/reducers/analyses.js +13 -8
  16. package/lib/common/selectors/analyses.js +7 -1
  17. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +79 -29
  18. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +4 -2
  19. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/fetchReports.js +15 -12
  20. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/fetchReportsStatus.js +59 -0
  21. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +10 -2
  22. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +53 -12
  23. package/package.json +9 -9
@@ -21,9 +21,9 @@ var _react = _interopRequireWildcard(require("react"));
21
21
 
22
22
  var _propTypes = _interopRequireDefault(require("prop-types"));
23
23
 
24
- var _uiSpinner = require("@instructure/ui-spinner");
24
+ var _uiText = require("@instructure/ui-text");
25
25
 
26
- var _uiHeading = require("@instructure/ui-heading");
26
+ var _uiSpinner = require("@instructure/ui-spinner");
27
27
 
28
28
  var _uiA11yContent = require("@instructure/ui-a11y-content");
29
29
 
@@ -36,14 +36,13 @@ var _theme = _interopRequireDefault(require("./theme.js"));
36
36
  var _dec, _class, _class2, _temp;
37
37
 
38
38
  var styles = {
39
- componentId: 'ebGcj',
39
+ componentId: 'cJgyM',
40
40
  template: function template(theme) {
41
- return "\n\n.ebGcj_gasz{align-items:center;display:inline-flex;flex:1 1 auto;height:100%;justify-content:center;min-height:500px;width:100%}\n\n:root .ebGcj_gasz,_:-ms-fullscreen{height:10rem}\n\n.ebGcj_bZBM .ebGcj_qrQc{flex:1 1 auto}\n\n.ebGcj_fBqo{font-size:".concat(theme.mainTextFontSize || 'inherit', "}");
41
+ return "\n\n.cJgyM_gasz{align-items:center;column-gap:10px;display:inline-flex;flex:1 1 auto;height:100%;justify-content:center;width:100%}\n\n:root .cJgyM_gasz,_:-ms-fullscreen{height:10rem}\n\n.cJgyM_bZBM .cJgyM_qrQc{flex:1 1 auto}";
42
42
  },
43
- 'wrapper': 'ebGcj_gasz',
44
- 'left': 'ebGcj_bZBM',
45
- 'right': 'ebGcj_qrQc',
46
- 'mainText': 'ebGcj_fBqo'
43
+ 'wrapper': 'cJgyM_gasz',
44
+ 'left': 'cJgyM_bZBM',
45
+ 'right': 'cJgyM_qrQc'
47
46
  };
48
47
  var QuizzesSpinner = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
49
48
  (0, _inherits2.default)(QuizzesSpinner, _Component);
@@ -58,34 +57,50 @@ var QuizzesSpinner = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles)
58
57
  (0, _createClass2.default)(QuizzesSpinner, [{
59
58
  key: "mainText",
60
59
  value: function mainText() {
61
- return this.props.mainText || (0, _formatMessage.default)('Loading...');
60
+ var _this$props = this.props,
61
+ color = _this$props.color,
62
+ mainText = _this$props.mainText,
63
+ fontSize = _this$props.fontSize;
64
+ return /*#__PURE__*/_react.default.createElement(_uiText.Text, {
65
+ size: fontSize,
66
+ color: color
67
+ }, mainText || (0, _formatMessage.default)('Loading...'));
62
68
  }
63
69
  }, {
64
70
  key: "render",
65
71
  value: function render() {
72
+ var _this$props2 = this.props,
73
+ size = _this$props2.size,
74
+ minHeight = _this$props2.minHeight;
66
75
  return /*#__PURE__*/_react.default.createElement("div", {
67
- className: styles.wrapper
76
+ className: styles.wrapper,
77
+ style: {
78
+ minHeight: minHeight
79
+ }
68
80
  }, /*#__PURE__*/_react.default.createElement("div", {
69
81
  className: styles.left
70
82
  }, /*#__PURE__*/_react.default.createElement(_uiSpinner.Spinner, {
71
83
  renderTitle: this.mainText(),
72
- size: "large"
84
+ size: size
73
85
  })), /*#__PURE__*/_react.default.createElement("div", {
74
86
  className: styles.right
75
- }, /*#__PURE__*/_react.default.createElement(_uiA11yContent.PresentationContent, null, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
76
- level: "h2",
77
- as: "h1"
78
- }, /*#__PURE__*/_react.default.createElement("div", {
79
- className: styles.mainText
80
- }, this.mainText())))));
87
+ }, /*#__PURE__*/_react.default.createElement(_uiA11yContent.PresentationContent, null, this.mainText())));
81
88
  }
82
89
  }]);
83
90
  QuizzesSpinner.displayName = "QuizzesSpinner";
84
91
  return QuizzesSpinner;
85
92
  }(_react.Component), _class2.propTypes = {
86
- mainText: _propTypes.default.string
93
+ mainText: _propTypes.default.string,
94
+ fontSize: _propTypes.default.oneOf(['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']),
95
+ size: _propTypes.default.oneOf(['x-small', 'small', 'medium', 'large']),
96
+ color: _propTypes.default.string,
97
+ minHeight: _propTypes.default.string
87
98
  }, _class2.defaultProps = {
88
- mainText: null
99
+ mainText: null,
100
+ size: 'large',
101
+ fontSize: 'xx-large',
102
+ minHeight: '500px',
103
+ color: 'primary'
89
104
  }, _temp)) || _class);
90
105
  exports.QuizzesSpinner = QuizzesSpinner;
91
106
  var _default = QuizzesSpinner;
@@ -5,9 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = generator;
7
7
 
8
- function generator(_ref) {
9
- var typography = _ref.typography;
10
- return {
11
- mainTextFontSize: typography.fontSizeXXLarge
12
- };
8
+ function generator() {
9
+ return {};
13
10
  }
@@ -1,14 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
- exports.default = exports.defaultState = exports.errorKey = exports.generationInProgressKey = exports.fetchInProgressKey = exports.itemAnalysesKey = exports.quizAnalysisKey = void 0;
8
+ exports.default = exports.defaultState = exports.errorKey = exports.statusPollingInProgressKey = exports.generationInProgressKey = exports.fetchInProgressKey = exports.itemAnalysesKey = exports.quizAnalysisKey = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
11
 
8
12
  var _immutable = require("immutable");
9
13
 
10
14
  var _quizCommon = require("@instructure/quiz-common");
11
15
 
16
+ var _fromJS;
17
+
12
18
  var quizAnalysisKey = 'quizAnalysis';
13
19
  exports.quizAnalysisKey = quizAnalysisKey;
14
20
  var itemAnalysesKey = 'itemAnalyses';
@@ -17,15 +23,11 @@ var fetchInProgressKey = 'fetchInProgress';
17
23
  exports.fetchInProgressKey = fetchInProgressKey;
18
24
  var generationInProgressKey = 'generationInProgress';
19
25
  exports.generationInProgressKey = generationInProgressKey;
26
+ var statusPollingInProgressKey = 'statusPollingInProgress';
27
+ exports.statusPollingInProgressKey = statusPollingInProgressKey;
20
28
  var errorKey = 'analysisError';
21
29
  exports.errorKey = errorKey;
22
- var defaultState = (0, _immutable.fromJS)({
23
- quizAnalysisKey: void 0,
24
- itemAnalysesKey: void 0,
25
- fetchStateKey: false,
26
- generationStateKey: false,
27
- errorKey: void 0
28
- });
30
+ var defaultState = (0, _immutable.fromJS)((_fromJS = {}, (0, _defineProperty2.default)(_fromJS, quizAnalysisKey, void 0), (0, _defineProperty2.default)(_fromJS, itemAnalysesKey, void 0), (0, _defineProperty2.default)(_fromJS, fetchInProgressKey, false), (0, _defineProperty2.default)(_fromJS, generationInProgressKey, false), (0, _defineProperty2.default)(_fromJS, statusPollingInProgressKey, false), (0, _defineProperty2.default)(_fromJS, errorKey, void 0), _fromJS));
29
31
  exports.defaultState = defaultState;
30
32
 
31
33
  var _default = function _default() {
@@ -45,6 +47,9 @@ var _default = function _default() {
45
47
  case _quizCommon.SET_ANALYSIS_GENERATION_IN_PROGRESS:
46
48
  return state.set(generationInProgressKey, action.payload);
47
49
 
50
+ case _quizCommon.SET_STATUS_POLLING_IN_PROGRESS:
51
+ return state.set(statusPollingInProgressKey, action.payload);
52
+
48
53
  case _quizCommon.SET_ANALYSIS_ERROR:
49
54
  return state.set(errorKey, action.payload);
50
55
 
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getAnalysisError = exports.getGenerationInProgress = exports.getFetchInProgress = exports.getItemAnalyses = exports.getQuizAnalysis = void 0;
6
+ exports.getAnalysisError = exports.getGenerationInProgress = exports.getStatusPollingInProgress = exports.getFetchInProgress = exports.getItemAnalyses = exports.getQuizAnalysis = void 0;
7
7
  var path = 'analyses';
8
8
 
9
9
  var getQuizAnalysis = function getQuizAnalysis(state) {
@@ -28,6 +28,12 @@ var getFetchInProgress = function getFetchInProgress(state) {
28
28
 
29
29
  exports.getFetchInProgress = getFetchInProgress;
30
30
 
31
+ var getStatusPollingInProgress = function getStatusPollingInProgress(state) {
32
+ return state.getIn([path, 'statusPollingInProgress'], false);
33
+ };
34
+
35
+ exports.getStatusPollingInProgress = getStatusPollingInProgress;
36
+
31
37
  var getGenerationInProgress = function getGenerationInProgress(state) {
32
38
  return state.getIn([path, 'generationInProgress'], false);
33
39
  };
@@ -46,17 +46,17 @@ var _propTypes2 = require("../propTypes.js");
46
46
  var _dec, _class, _class2, _temp;
47
47
 
48
48
  var styles = {
49
- componentId: 'eJSiT',
49
+ componentId: 'boQPo',
50
50
  template: function template(theme) {
51
- return "\n\n.eJSiT_bqdH{column-gap:5px;display:flex;justify-content:space-between;padding:".concat(theme.metricsPadding || 'inherit', " 0}\n\n.eJSiT_fbIL{border-radius:").concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.eJSiT_blRb{max-width:160px;padding-right:10px}");
51
+ return "\n\n.boQPo_bqdH{column-gap:5px;display:flex;justify-content:space-between;padding-bottom:".concat(theme.metricsPadding || 'inherit', "}\n\n.boQPo_PFlN{border-radius:").concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.boQPo_blRb{max-width:160px;padding-right:10px}\n\n.boQPo_bxzy{border-bottom:1px solid ").concat(theme.quizSummaryBorderBottomColor || 'inherit', ";margin-bottom:15px;padding-bottom:15px}\n\n.boQPo_dKIc{padding-bottom:15px}\n\n.boQPo_cGHR{align-self:flex-end}");
52
52
  },
53
- 'metricsContainer': 'eJSiT_bqdH',
54
- 'card': 'eJSiT_fbIL',
55
- 'dateContainer': 'eJSiT_blRb'
53
+ 'metricsContainer': 'boQPo_bqdH',
54
+ 'reportCard': 'boQPo_PFlN',
55
+ 'dateContainer': 'boQPo_blRb',
56
+ 'quizAnalysisSummary': 'boQPo_bxzy',
57
+ 'titleContainer': 'boQPo_dKIc',
58
+ 'spinnerContainer': 'boQPo_cGHR'
56
59
  };
57
-
58
- var _ref = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
59
-
60
60
  var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
61
61
  (0, _inherits2.default)(NewQuizAndItemAnalysisReportCardPresenter, _Component);
62
62
 
@@ -97,20 +97,14 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
97
97
  }));
98
98
  };
99
99
 
100
- return _this;
101
- }
102
-
103
- (0, _createClass2.default)(NewQuizAndItemAnalysisReportCardPresenter, [{
104
- key: "renderContent",
105
- value: function renderContent() {
106
- var _this$props = this.props,
107
- name = _this$props.name,
108
- href = _this$props.href,
109
- quizAnalysis = _this$props.quizAnalysis;
110
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
111
- size: "medium",
112
- weight: "bold"
113
- }, name), this.renderMetrics(), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
100
+ _this.renderQuizAnalysisSummary = function () {
101
+ var _this$props = _this.props,
102
+ quizAnalysis = _this$props.quizAnalysis,
103
+ itemAnalyses = _this$props.itemAnalyses,
104
+ href = _this$props.href;
105
+ return /*#__PURE__*/_react.default.createElement("div", {
106
+ className: styles.quizAnalysisSummary
107
+ }, _this.renderMetrics(), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
114
108
  direction: "row",
115
109
  justifyItems: "space-between"
116
110
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -118,18 +112,66 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
118
112
  }, /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
119
113
  date: quizAnalysis.created_timestamp,
120
114
  multiline: true
121
- })), /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
115
+ })), quizAnalysis && itemAnalyses && /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
122
116
  href: href
123
117
  }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
124
118
  size: "small"
125
119
  }, (0, _formatMessage.default)('View Report')))));
126
- }
127
- }, {
120
+ };
121
+
122
+ _this.renderSpinner = function (mainText) {
123
+ return /*#__PURE__*/_react.default.createElement(_Spinner.default, {
124
+ size: "x-small",
125
+ color: "brand",
126
+ minHeight: "0",
127
+ mainText: mainText,
128
+ fontSize: "x-small"
129
+ });
130
+ };
131
+
132
+ _this.renderReportCardFooter = function () {
133
+ var _this$props2 = _this.props,
134
+ generationInProgress = _this$props2.generationInProgress,
135
+ generateReports = _this$props2.generateReports,
136
+ analysisError = _this$props2.analysisError;
137
+ return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
138
+ direction: "row",
139
+ justifyItems: "space-between"
140
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
141
+ shouldShrink: true
142
+ }, analysisError && !generationInProgress && /*#__PURE__*/_react.default.createElement(_uiText.Text, {
143
+ size: "x-small",
144
+ lineHeight: "fit",
145
+ weight: "bold",
146
+ color: "danger"
147
+ }, analysisError)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, generationInProgress ? _this.renderSpinner((0, _formatMessage.default)('Generation In Progress')) : /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
148
+ onClick: generateReports,
149
+ role: "button"
150
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
151
+ size: "small"
152
+ }, (0, _formatMessage.default)('Generate Report')))));
153
+ };
154
+
155
+ return _this;
156
+ }
157
+
158
+ (0, _createClass2.default)(NewQuizAndItemAnalysisReportCardPresenter, [{
128
159
  key: "render",
129
160
  value: function render() {
161
+ var _this$props3 = this.props,
162
+ fetchInProgress = _this$props3.fetchInProgress,
163
+ name = _this$props3.name,
164
+ quizAnalysis = _this$props3.quizAnalysis;
130
165
  return /*#__PURE__*/_react.default.createElement(_index.default, {
131
- className: styles.card
132
- }, this.props.quizAnalysis ? this.renderContent() : _ref);
166
+ className: styles.reportCard
167
+ }, /*#__PURE__*/_react.default.createElement("div", {
168
+ className: styles.titleContainer
169
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
170
+ size: "medium",
171
+ weight: "bold"
172
+ }, name)), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && /*#__PURE__*/_react.default.createElement("div", {
173
+ className: styles.spinnerContainer
174
+ }, this.renderSpinner()), !fetchInProgress && this.renderReportCardFooter());
133
175
  }
134
176
  }]);
135
177
  NewQuizAndItemAnalysisReportCardPresenter.displayName = "NewQuizAndItemAnalysisReportCardPresenter";
@@ -137,10 +179,18 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
137
179
  }(_react.Component), _class2.propTypes = {
138
180
  name: _propTypes.default.node,
139
181
  href: _propTypes.default.string,
140
- quizAnalysis: _propTypes2.quizAnalysisPropType
182
+ quizAnalysis: _propTypes2.quizAnalysisPropType,
183
+ itemAnalyses: _propTypes.default.arrayOf(_propTypes2.itemAnalysisPropType),
184
+ fetchInProgress: _propTypes.default.bool.isRequired,
185
+ generationInProgress: _propTypes.default.bool.isRequired,
186
+ analysisError: _propTypes.default.string,
187
+ generateReports: _propTypes.default.func.isRequired
141
188
  }, _class2.defaultProps = {
142
189
  name: void 0,
143
190
  href: void 0,
144
- quizAnalysis: void 0
191
+ analysisError: void 0,
192
+ generationInProgress: void 0,
193
+ quizAnalysis: void 0,
194
+ itemAnalyses: void 0
145
195
  }, _temp)) || _class);
146
196
  exports.NewQuizAndItemAnalysisReportCardPresenter = NewQuizAndItemAnalysisReportCardPresenter;
@@ -7,13 +7,15 @@ exports.default = generator;
7
7
 
8
8
  function generator(_ref) {
9
9
  var spacing = _ref.spacing,
10
- borders = _ref.borders;
10
+ borders = _ref.borders,
11
+ colors = _ref.colors;
11
12
  return {
12
13
  metricsPadding: spacing.medium,
13
14
  cardWidth: '16rem',
14
15
  cardPadding: spacing.medium,
15
16
  cardMargin: spacing.xSmall,
16
17
  cardBoxShadow: '1px 1px 3px 0 #ddd',
17
- cardBorderRadius: borders.radiusMedium
18
+ cardBorderRadius: borders.radiusMedium,
19
+ quizSummaryBorderBottomColor: colors.tiara
18
20
  };
19
21
  }
@@ -17,13 +17,13 @@ var _errorMessages = require("./errorMessages.js");
17
17
 
18
18
  var fetchReports = /*#__PURE__*/function () {
19
19
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
20
- var activeQuizId, setFetchInProgress, setQuizAnalysis, setItemAnalyses, setAnalysisError, setGenerationInProgress, addError, fetchQuizAnalysis, fetchItemAnalyses, _yield$Promise$all, _yield$Promise$all2, quizAnalysis, itemAnalyses;
20
+ var activeQuizId, setFetchInProgress, setQuizAnalysis, setItemAnalyses, setStatusPollingInProgress, setAnalysisError, setGenerationInProgress, addError, fetchQuizAnalysis, fetchItemAnalyses, _yield$Promise$all, _yield$Promise$all2, quizAnalysis, itemAnalyses, areAnalysesInProgress, areAnalysesFailed;
21
21
 
22
22
  return _regenerator.default.wrap(function _callee$(_context) {
23
23
  while (1) {
24
24
  switch (_context.prev = _context.next) {
25
25
  case 0:
26
- activeQuizId = _ref.activeQuizId, setFetchInProgress = _ref.setFetchInProgress, setQuizAnalysis = _ref.setQuizAnalysis, setItemAnalyses = _ref.setItemAnalyses, setAnalysisError = _ref.setAnalysisError, setGenerationInProgress = _ref.setGenerationInProgress, addError = _ref.addError, fetchQuizAnalysis = _ref.fetchQuizAnalysis, fetchItemAnalyses = _ref.fetchItemAnalyses;
26
+ activeQuizId = _ref.activeQuizId, setFetchInProgress = _ref.setFetchInProgress, setQuizAnalysis = _ref.setQuizAnalysis, setItemAnalyses = _ref.setItemAnalyses, setStatusPollingInProgress = _ref.setStatusPollingInProgress, setAnalysisError = _ref.setAnalysisError, setGenerationInProgress = _ref.setGenerationInProgress, addError = _ref.addError, fetchQuizAnalysis = _ref.fetchQuizAnalysis, fetchItemAnalyses = _ref.fetchItemAnalyses;
27
27
  _context.prev = 1;
28
28
  setFetchInProgress(true);
29
29
  _context.next = 5;
@@ -34,33 +34,36 @@ var fetchReports = /*#__PURE__*/function () {
34
34
  _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 2);
35
35
  quizAnalysis = _yield$Promise$all2[0];
36
36
  itemAnalyses = _yield$Promise$all2[1];
37
+ areAnalysesInProgress = quizAnalysis.new_analysis_in_progress || itemAnalyses.new_analysis_in_progress;
38
+ areAnalysesFailed = quizAnalysis.last_analysis_failed || itemAnalyses.last_analysis_failed;
39
+ setGenerationInProgress(areAnalysesInProgress);
40
+ setStatusPollingInProgress(areAnalysesInProgress);
37
41
  setQuizAnalysis(quizAnalysis.last_successful_analysis);
38
42
  setItemAnalyses(itemAnalyses.last_successful_analysis);
39
- setGenerationInProgress(quizAnalysis.new_analysis_in_progress || itemAnalyses.new_analysis_in_progress);
40
43
 
41
- if (quizAnalysis.last_analysis_failed || itemAnalyses.last_analysis_failed) {
44
+ if (areAnalysesFailed) {
42
45
  setAnalysisError((0, _errorMessages.getLastReportGenerationFailed)());
43
46
  }
44
47
 
45
- _context.next = 18;
48
+ _context.next = 21;
46
49
  break;
47
50
 
48
- case 15:
49
- _context.prev = 15;
51
+ case 18:
52
+ _context.prev = 18;
50
53
  _context.t0 = _context["catch"](1);
51
54
  addError((0, _errorMessages.getFailedToFetchReports)());
52
55
 
53
- case 18:
54
- _context.prev = 18;
56
+ case 21:
57
+ _context.prev = 21;
55
58
  setFetchInProgress(false);
56
- return _context.finish(18);
59
+ return _context.finish(21);
57
60
 
58
- case 21:
61
+ case 24:
59
62
  case "end":
60
63
  return _context.stop();
61
64
  }
62
65
  }
63
- }, _callee, null, [[1, 15, 18, 21]]);
66
+ }, _callee, null, [[1, 18, 21, 24]]);
64
67
  }));
65
68
 
66
69
  return function fetchReports(_x) {
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.fetchReportsStatus = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _errorMessages = require("./errorMessages.js");
15
+
16
+ var fetchReportsStatus = /*#__PURE__*/function () {
17
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
18
+ var activeQuizId, addError, fetchAnalysesStatus, instrumentedFetchReports, setStatusPollingInProgress, setGenerationInProgress, status, isReportGenerationReady;
19
+ return _regenerator.default.wrap(function _callee$(_context) {
20
+ while (1) {
21
+ switch (_context.prev = _context.next) {
22
+ case 0:
23
+ activeQuizId = _ref.activeQuizId, addError = _ref.addError, fetchAnalysesStatus = _ref.fetchAnalysesStatus, instrumentedFetchReports = _ref.instrumentedFetchReports, setStatusPollingInProgress = _ref.setStatusPollingInProgress, setGenerationInProgress = _ref.setGenerationInProgress;
24
+ _context.prev = 1;
25
+ _context.next = 4;
26
+ return fetchAnalysesStatus(activeQuizId);
27
+
28
+ case 4:
29
+ status = _context.sent;
30
+ isReportGenerationReady = !status.quiz_analysis_in_progress && !status.item_analyses_in_progress;
31
+
32
+ if (isReportGenerationReady) {
33
+ instrumentedFetchReports();
34
+ }
35
+
36
+ _context.next = 14;
37
+ break;
38
+
39
+ case 9:
40
+ _context.prev = 9;
41
+ _context.t0 = _context["catch"](1);
42
+ addError((0, _errorMessages.getFailedToFetchReports)());
43
+ setStatusPollingInProgress(false);
44
+ setGenerationInProgress(false);
45
+
46
+ case 14:
47
+ case "end":
48
+ return _context.stop();
49
+ }
50
+ }
51
+ }, _callee, null, [[1, 9]]);
52
+ }));
53
+
54
+ return function fetchReportsStatus(_x) {
55
+ return _ref2.apply(this, arguments);
56
+ };
57
+ }();
58
+
59
+ exports.fetchReportsStatus = fetchReportsStatus;
@@ -16,6 +16,8 @@ var _getQuizAnalysis = require("../../../api/getQuizAnalysis.js");
16
16
 
17
17
  var _getItemAnalyses = require("../../../api/getItemAnalyses.js");
18
18
 
19
+ var _getAnalysesStatus = require("../../../api/getAnalysesStatus.js");
20
+
19
21
  var _reactRedux = require("../../../../common/react-redux.js");
20
22
 
21
23
  var _redux = require("redux");
@@ -24,16 +26,21 @@ var _quizzes = require("../../../../common/selectors/quizzes.js");
24
26
 
25
27
  var _alerts = require("../../../../common/actions/alerts.js");
26
28
 
29
+ var DEFAULT_POLLING_INTERVAL = 3000;
30
+
27
31
  function mapStateToProps(state, ownProps) {
28
32
  return {
29
33
  quizAnalysis: (0, _analyses.getQuizAnalysis)(state),
30
34
  itemAnalyses: (0, _analyses.getItemAnalyses)(state),
31
35
  fetchInProgress: (0, _analyses.getFetchInProgress)(state),
32
36
  generationInProgress: (0, _analyses.getGenerationInProgress)(state),
37
+ statusPollingInProgress: (0, _analyses.getStatusPollingInProgress)(state),
33
38
  analysisError: (0, _analyses.getAnalysisError)(state),
34
39
  activeQuizId: ownProps.activeQuizId || (0, _quizzes.getActiveQuizId)(state),
35
40
  fetchQuizAnalysis: _getQuizAnalysis.getQuizAnalysis,
36
- fetchItemAnalyses: _getItemAnalyses.getItemAnalyses
41
+ fetchItemAnalyses: _getItemAnalyses.getItemAnalyses,
42
+ fetchAnalysesStatus: _getAnalysesStatus.getAnalysesStatus,
43
+ pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL
37
44
  };
38
45
  }
39
46
 
@@ -43,7 +50,8 @@ var mapDispatchToProps = {
43
50
  setFetchInProgress: _analyses2.setFetchInProgress,
44
51
  setGenerationInProgress: _analyses2.setGenerationInProgress,
45
52
  setAnalysisError: _analyses2.setAnalysisError,
46
- addError: _alerts.addError
53
+ addError: _alerts.addError,
54
+ setStatusPollingInProgress: _analyses2.setStatusPollingInProgress
47
55
  };
48
56
  var withAnalysisState = (0, _redux.compose)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps), _withAnalysisStatePresenter.withAnalysisStatePresenter);
49
57
  exports.withAnalysisState = withAnalysisState;
@@ -23,6 +23,8 @@ var _propTypes2 = require("./propTypes.js");
23
23
 
24
24
  var _fetchReports = require("./fetchReports.js");
25
25
 
26
+ var _fetchReportsStatus = require("./fetchReportsStatus.js");
27
+
26
28
  var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalComponent) {
27
29
  var WithAnalysisStatePresenter = function WithAnalysisStatePresenter(_ref) {
28
30
  var quizAnalysis = _ref.quizAnalysis,
@@ -40,18 +42,38 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
40
42
  generateReport = _ref.generateReport,
41
43
  fetchQuizAnalysis = _ref.fetchQuizAnalysis,
42
44
  fetchItemAnalyses = _ref.fetchItemAnalyses,
43
- passThroughProps = (0, _objectWithoutProperties2.default)(_ref, ["quizAnalysis", "itemAnalyses", "fetchInProgress", "generationInProgress", "analysisError", "setQuizAnalysis", "addError", "setItemAnalyses", "setFetchInProgress", "setGenerationInProgress", "setAnalysisError", "activeQuizId", "generateReport", "fetchQuizAnalysis", "fetchItemAnalyses"]);
45
+ fetchAnalysesStatus = _ref.fetchAnalysesStatus,
46
+ statusPollingInProgress = _ref.statusPollingInProgress,
47
+ setStatusPollingInProgress = _ref.setStatusPollingInProgress,
48
+ pollingInterval = _ref.pollingInterval,
49
+ passThroughProps = (0, _objectWithoutProperties2.default)(_ref, ["quizAnalysis", "itemAnalyses", "fetchInProgress", "generationInProgress", "analysisError", "setQuizAnalysis", "addError", "setItemAnalyses", "setFetchInProgress", "setGenerationInProgress", "setAnalysisError", "activeQuizId", "generateReport", "fetchQuizAnalysis", "fetchItemAnalyses", "fetchAnalysesStatus", "statusPollingInProgress", "setStatusPollingInProgress", "pollingInterval"]);
44
50
  WithAnalysisStatePresenter.displayName = "WithAnalysisStatePresenter(".concat(OriginalComponent.displayName || OriginalComponent.name, ")");
45
- var reportFetchingConfig = {
46
- activeQuizId: activeQuizId,
47
- addError: addError,
48
- fetchQuizAnalysis: fetchQuizAnalysis,
49
- fetchItemAnalyses: fetchItemAnalyses,
50
- setAnalysisError: setAnalysisError,
51
- setItemAnalyses: setItemAnalyses,
52
- setGenerationInProgress: setGenerationInProgress,
53
- setFetchInProgress: setFetchInProgress,
54
- setQuizAnalysis: setQuizAnalysis
51
+ var runningInterval = (0, _react.useRef)(null);
52
+
53
+ var instrumentedFetchReports = function instrumentedFetchReports() {
54
+ return (0, _fetchReports.fetchReports)({
55
+ activeQuizId: activeQuizId,
56
+ addError: addError,
57
+ fetchQuizAnalysis: fetchQuizAnalysis,
58
+ fetchItemAnalyses: fetchItemAnalyses,
59
+ setAnalysisError: setAnalysisError,
60
+ setStatusPollingInProgress: setStatusPollingInProgress,
61
+ setItemAnalyses: setItemAnalyses,
62
+ setGenerationInProgress: setGenerationInProgress,
63
+ setFetchInProgress: setFetchInProgress,
64
+ setQuizAnalysis: setQuizAnalysis
65
+ });
66
+ };
67
+
68
+ var instrumentedStatusFetching = function instrumentedStatusFetching() {
69
+ return (0, _fetchReportsStatus.fetchReportsStatus)({
70
+ activeQuizId: activeQuizId,
71
+ addError: addError,
72
+ setGenerationInProgress: setGenerationInProgress,
73
+ setStatusPollingInProgress: setStatusPollingInProgress,
74
+ fetchAnalysesStatus: fetchAnalysesStatus,
75
+ instrumentedFetchReports: instrumentedFetchReports
76
+ });
55
77
  };
56
78
 
57
79
  function generateReports() {
@@ -89,7 +111,7 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
89
111
  }
90
112
 
91
113
  _context.next = 4;
92
- return (0, _fetchReports.fetchReports)(reportFetchingConfig);
114
+ return instrumentedFetchReports();
93
115
 
94
116
  case 4:
95
117
  case "end":
@@ -106,6 +128,21 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
106
128
 
107
129
  fetchIfNeeded();
108
130
  }, []);
131
+ (0, _react.useEffect)(function () {
132
+ if (statusPollingInProgress && !runningInterval.current) {
133
+ runningInterval.current = setInterval(instrumentedStatusFetching, pollingInterval);
134
+ }
135
+
136
+ if (!statusPollingInProgress && runningInterval.current) {
137
+ clearInterval(runningInterval.current);
138
+ runningInterval.current = null;
139
+ } // unmount cleanup
140
+
141
+
142
+ return function () {
143
+ return clearInterval(runningInterval.current);
144
+ };
145
+ }, [statusPollingInProgress]);
109
146
  return /*#__PURE__*/_react.default.createElement(OriginalComponent, Object.assign({
110
147
  quizAnalysis: quizAnalysis,
111
148
  itemAnalyses: itemAnalyses,
@@ -121,16 +158,20 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
121
158
  itemAnalyses: _propTypes.default.arrayOf(_propTypes2.itemAnalysisPropType),
122
159
  fetchInProgress: _propTypes.default.bool.isRequired,
123
160
  generationInProgress: _propTypes.default.bool.isRequired,
161
+ statusPollingInProgress: _propTypes.default.bool.isRequired,
124
162
  analysisError: _propTypes.default.string,
125
163
  setQuizAnalysis: _propTypes.default.func.isRequired,
126
164
  setItemAnalyses: _propTypes.default.func.isRequired,
127
165
  setFetchInProgress: _propTypes.default.func.isRequired,
128
166
  setGenerationInProgress: _propTypes.default.func.isRequired,
129
167
  setAnalysisError: _propTypes.default.func.isRequired,
168
+ setStatusPollingInProgress: _propTypes.default.func.isRequired,
130
169
  activeQuizId: _propTypes.default.string.isRequired,
131
170
  fetchQuizAnalysis: _propTypes.default.func.isRequired,
132
171
  fetchItemAnalyses: _propTypes.default.func.isRequired,
172
+ fetchAnalysesStatus: _propTypes.default.func.isRequired,
133
173
  addError: _propTypes.default.func.isRequired,
174
+ pollingInterval: _propTypes.default.number.isRequired,
134
175
  // can be required after passed from LTI
135
176
  generateReport: _propTypes.default.func
136
177
  };