@coorpacademy/app-review 0.1.19 → 0.1.20

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 (34) hide show
  1. package/es/actions/api/post-answer.js +9 -8
  2. package/es/actions/api/test/post-answer.test.js +6 -6
  3. package/es/reducers/data/test/progression.test.js +4 -3
  4. package/es/services/post-answer.d.ts +1 -1
  5. package/es/services/post-answer.js +3 -1
  6. package/es/services/test/post-answer.test.js +27 -4
  7. package/es/test/util/services.mock.d.ts +2 -1
  8. package/es/test/util/services.mock.js +264 -23
  9. package/es/types/common.d.ts +11 -9
  10. package/es/views/slides/index.d.ts +1 -0
  11. package/es/views/slides/index.js +24 -8
  12. package/es/views/slides/test/index.test.js +518 -203
  13. package/lib/actions/api/post-answer.js +10 -9
  14. package/lib/actions/api/test/post-answer.test.js +6 -6
  15. package/lib/reducers/data/test/progression.test.js +4 -3
  16. package/lib/services/post-answer.d.ts +1 -1
  17. package/lib/services/post-answer.js +4 -2
  18. package/lib/services/test/post-answer.test.js +27 -4
  19. package/lib/test/util/services.mock.d.ts +2 -1
  20. package/lib/test/util/services.mock.js +265 -23
  21. package/lib/types/common.d.ts +11 -9
  22. package/lib/views/slides/index.d.ts +1 -0
  23. package/lib/views/slides/index.js +23 -7
  24. package/lib/views/slides/test/index.test.js +521 -203
  25. package/package.json +3 -4
  26. package/src/actions/api/post-answer.ts +9 -9
  27. package/src/actions/api/test/post-answer.test.ts +6 -6
  28. package/src/reducers/data/test/progression.test.ts +4 -3
  29. package/src/services/post-answer.ts +3 -2
  30. package/src/services/test/post-answer.test.ts +28 -4
  31. package/src/test/util/services.mock.ts +274 -24
  32. package/src/types/common.ts +13 -10
  33. package/src/views/slides/index.ts +35 -10
  34. package/src/views/slides/test/index.test.ts +559 -228
@@ -43,27 +43,28 @@ export var POST_ANSWER_FAILURE = '@@answer/POST_FAILURE';
43
43
  export var postAnswer = function (dispatch, getState, _a) {
44
44
  var services = _a.services;
45
45
  return __awaiter(void 0, void 0, void 0, function () {
46
- var action, response, progression, slideRef;
46
+ var state, token, answer, progression, action, response, updatedProgression, slideRef;
47
47
  return __generator(this, function (_b) {
48
48
  switch (_b.label) {
49
49
  case 0:
50
+ state = getState();
51
+ token = get('data.token', state);
52
+ answer = get('ui.answers', state);
53
+ progression = state.data.progression;
54
+ if (!progression)
55
+ throw new Error('cannot answer question of inexisting progression');
50
56
  action = buildTask({
51
57
  types: [POST_ANSWER_REQUEST, POST_ANSWER_SUCCESS, POST_ANSWER_FAILURE],
52
58
  task: function () {
53
- var state = getState();
54
- var token = get('data.token', state);
55
- var answer = get('ui.answers', state);
56
- var progressionId = get('data.progression._id', state);
57
- var skillRef = get('data.progression.content.ref', state);
58
- return services.postAnswer(skillRef, token, progressionId, answer);
59
+ return services.postAnswer(progression, token, answer);
59
60
  }
60
61
  });
61
62
  return [4 /*yield*/, dispatch(action)];
62
63
  case 1:
63
64
  response = _b.sent();
64
65
  if (!(response.type === POST_ANSWER_SUCCESS)) return [3 /*break*/, 3];
65
- progression = response.payload;
66
- slideRef = progression.state.nextContent.ref;
66
+ updatedProgression = response.payload;
67
+ slideRef = updatedProgression.state.nextContent.ref;
67
68
  return [4 /*yield*/, dispatch(fetchSlide(slideRef))];
68
69
  case 2:
69
70
  _b.sent();
@@ -48,7 +48,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
48
48
  var _a;
49
49
  import test from 'ava';
50
50
  import { createTestStore } from '../../test/create-test-store';
51
- import { postAnswerResponse, services } from '../../../test/util/services.mock';
51
+ import { postAnswerResponses, services } from '../../../test/util/services.mock';
52
52
  import { postAnswer, POST_ANSWER_FAILURE, POST_ANSWER_REQUEST, POST_ANSWER_SUCCESS } from '../post-answer';
53
53
  import { SLIDE_FETCH_REQUEST, SLIDE_FETCH_SUCCESS } from '../fetch-slide';
54
54
  import { qcmGraphicSlide } from '../../../views/slides/test/fixtures/qcm-graphic';
@@ -69,7 +69,7 @@ var initialState = {
69
69
  allAnswers: [],
70
70
  isCorrect: true,
71
71
  nextContent: {
72
- ref: 'sli_VJYjJnJhg',
72
+ ref: freeTextSlide.id,
73
73
  type: 'slide'
74
74
  },
75
75
  pendingSlides: [],
@@ -87,7 +87,7 @@ var initialState = {
87
87
  token: '1234'
88
88
  },
89
89
  ui: {
90
- currentSlideRef: 'sli_VJYjJnJhg',
90
+ currentSlideRef: freeTextSlide.id,
91
91
  navigation: ['skills', 'slides'],
92
92
  answers: answer,
93
93
  slide: {
@@ -104,12 +104,12 @@ test('should dispatch POST_ANSWER_REQUEST, then POST_ANSWER_SUCCESS when the upd
104
104
  { type: POST_ANSWER_REQUEST },
105
105
  {
106
106
  type: POST_ANSWER_SUCCESS,
107
- payload: postAnswerResponse
107
+ payload: postAnswerResponses[freeTextSlide.id]
108
108
  },
109
- { type: SLIDE_FETCH_REQUEST, meta: { slideRef: 'sli_VkSQroQnx' } },
109
+ { type: SLIDE_FETCH_REQUEST, meta: { slideRef: qcmGraphicSlide.id } },
110
110
  {
111
111
  type: SLIDE_FETCH_SUCCESS,
112
- meta: { slideRef: 'sli_VkSQroQnx' },
112
+ meta: { slideRef: qcmGraphicSlide.id },
113
113
  payload: qcmGraphicSlide
114
114
  },
115
115
  { type: SET_CURRENT_SLIDE, payload: qcmGraphicSlide }
@@ -2,7 +2,8 @@ import test from 'ava';
2
2
  import reducer from '../progression';
3
3
  import { POST_PROGRESSION_SUCCESS } from '../../../actions/api/post-progression';
4
4
  import { POST_ANSWER_SUCCESS } from '../../../actions/api/post-answer';
5
- import { postAnswerResponse, postProgressionResponse } from '../../../test/util/services.mock';
5
+ import { postAnswerResponses, postProgressionResponse } from '../../../test/util/services.mock';
6
+ import { freeTextSlide } from '../../../views/slides/test/fixtures/free-text';
6
7
  test('should have initial value', function (t) {
7
8
  var state = reducer(undefined, {});
8
9
  t.is(state, null);
@@ -17,7 +18,7 @@ test('should set the value of POST_PROGRESSION_SUCCESS action', function (t) {
17
18
  test('should set the value of POST_ANSWER_SUCCESS action', function (t) {
18
19
  var state = reducer(null, {
19
20
  type: POST_ANSWER_SUCCESS,
20
- payload: postAnswerResponse
21
+ payload: postAnswerResponses[freeTextSlide.universalRef]
21
22
  });
22
- t.deepEqual(state, postAnswerResponse);
23
+ t.deepEqual(state, postAnswerResponses[freeTextSlide.universalRef]);
23
24
  });
@@ -1,2 +1,2 @@
1
1
  import { ProgressionFromAPI } from '../types/common';
2
- export declare const postAnswer: (skillRef: string, token: string, progressionId: string, answer: string[]) => Promise<ProgressionFromAPI>;
2
+ export declare const postAnswer: (progression: ProgressionFromAPI, token: string, answer: string[]) => Promise<ProgressionFromAPI>;
@@ -37,11 +37,13 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  import crossFetch from 'cross-fetch';
38
38
  import decode from 'jwt-decode';
39
39
  import { toJSON } from './tools/fetch-responses';
40
- export var postAnswer = function (skillRef, token, progressionId, answer) { return __awaiter(void 0, void 0, void 0, function () {
41
- var host, response;
40
+ export var postAnswer = function (progression, token, answer) { return __awaiter(void 0, void 0, void 0, function () {
41
+ var progressionId, skillRef, host, response;
42
42
  return __generator(this, function (_a) {
43
43
  switch (_a.label) {
44
44
  case 0:
45
+ progressionId = progression._id;
46
+ skillRef = progression.content.ref;
45
47
  host = decode(token).host;
46
48
  return [4 /*yield*/, crossFetch("".concat(host, "/api/v2/progressions/").concat(progressionId, "/answers"), {
47
49
  method: 'post',
@@ -37,9 +37,32 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  import test from 'ava';
38
38
  import nock from 'nock';
39
39
  import { postAnswer } from '../post-answer';
40
- var progressionId = '123456789123';
41
40
  var skillRef = '_skill-ref';
42
41
  var answer = ['Lister vos tâches pour vous libérer l’esprit', 'Vous isoler dans un lieu calme'];
42
+ var initProgression = {
43
+ content: {
44
+ type: 'skill',
45
+ ref: skillRef
46
+ },
47
+ engine: {
48
+ ref: 'review'
49
+ },
50
+ _id: '123456123456',
51
+ state: {
52
+ allAnswers: [],
53
+ isCorrect: true,
54
+ nextContent: {
55
+ type: 'slide',
56
+ ref: 'sli_NkvrWPFF2'
57
+ },
58
+ pendingSlides: [],
59
+ slides: [],
60
+ step: {
61
+ current: 1
62
+ },
63
+ stars: 0
64
+ }
65
+ };
43
66
  var result = {
44
67
  content: {
45
68
  type: 'skill',
@@ -76,7 +99,7 @@ var result = {
76
99
  };
77
100
  test.before(function () {
78
101
  var moocApi = nock('http://localhost:3000');
79
- moocApi.post("/api/v2/progressions/".concat(progressionId, "/answers")).reply(200, result);
102
+ moocApi.post('/api/v2/progressions/123456123456/answers').reply(200, result);
80
103
  });
81
104
  test.after(function () {
82
105
  nock.cleanAll();
@@ -87,7 +110,7 @@ test('should post the answers successfully', function (t) { return __awaiter(voi
87
110
  switch (_a.label) {
88
111
  case 0:
89
112
  token = process.env.API_TEST_TOKEN || '';
90
- return [4 /*yield*/, postAnswer(skillRef, token, progressionId, answer)];
113
+ return [4 /*yield*/, postAnswer(initProgression, token, answer)];
91
114
  case 1:
92
115
  progression = _a.sent();
93
116
  t.deepEqual(result, progression);
@@ -101,7 +124,7 @@ test('should reject bad token', function (t) { return __awaiter(void 0, void 0,
101
124
  switch (_a.label) {
102
125
  case 0:
103
126
  badToken = 'token is not a jwt';
104
- return [4 /*yield*/, t.throwsAsync(function () { return postAnswer(skillRef, badToken, progressionId, answer); })];
127
+ return [4 /*yield*/, t.throwsAsync(function () { return postAnswer(initProgression, badToken, answer); })];
105
128
  case 1:
106
129
  error = _a.sent();
107
130
  t.is(error === null || error === void 0 ? void 0 : error.message, "Invalid token specified: Cannot read properties of undefined (reading 'replace')");
@@ -1,4 +1,5 @@
1
1
  import { ProgressionFromAPI, Services } from '../../types/common';
2
2
  export declare const postProgressionResponse: ProgressionFromAPI;
3
- export declare const postAnswerResponse: ProgressionFromAPI;
3
+ export declare const postAnswerResponses: Record<string, ProgressionFromAPI>;
4
+ export declare const progressionSlideWithPendingSlide: ProgressionFromAPI;
4
5
  export declare const services: Services;
@@ -9,11 +9,20 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ var _a;
13
+ import get from 'lodash/fp/get';
12
14
  import { qcmSlide } from '../../views/slides/test/fixtures/qcm';
13
15
  import { qcmGraphicSlide } from '../../views/slides/test/fixtures/qcm-graphic';
14
16
  import { freeTextSlide } from '../../views/slides/test/fixtures/free-text';
15
17
  import { sliderSlide } from '../../views/slides/test/fixtures/slider';
16
18
  import { templateSlide } from '../../views/slides/test/fixtures/template';
19
+ var content = {
20
+ ref: '_skill-ref',
21
+ type: 'skill'
22
+ };
23
+ var engine = {
24
+ ref: 'review'
25
+ };
17
26
  var getSlideFixture = function (ref) {
18
27
  switch (ref) {
19
28
  case qcmSlide.universalRef:
@@ -44,18 +53,13 @@ var fetchSkillsResponse = [
44
53
  ];
45
54
  export var postProgressionResponse = {
46
55
  _id: '62b1d1087aa12f00253f40ee',
47
- content: {
48
- ref: '_skill-ref',
49
- type: 'skill'
50
- },
51
- engine: {
52
- ref: 'review'
53
- },
56
+ content: content,
57
+ engine: engine,
54
58
  state: {
55
59
  allAnswers: [],
56
60
  isCorrect: true,
57
61
  nextContent: {
58
- ref: 'sli_VJYjJnJhg',
62
+ ref: freeTextSlide.universalRef,
59
63
  type: 'slide'
60
64
  },
61
65
  pendingSlides: [],
@@ -66,43 +70,281 @@ export var postProgressionResponse = {
66
70
  stars: 0
67
71
  }
68
72
  };
69
- export var postAnswerResponse = {
70
- _id: '62b1d1087aa12f00253f40ee',
71
- content: {
72
- ref: '_skill-ref',
73
- type: 'skill'
73
+ export var postAnswerResponses = (_a = {},
74
+ _a[freeTextSlide.universalRef] = {
75
+ _id: '62b1d1087aa12f00253f40ee',
76
+ content: content,
77
+ engine: engine,
78
+ state: {
79
+ allAnswers: [
80
+ {
81
+ slideRef: freeTextSlide.universalRef,
82
+ isCorrect: true,
83
+ answer: ['Benchmark']
84
+ }
85
+ ],
86
+ isCorrect: true,
87
+ nextContent: {
88
+ ref: qcmGraphicSlide.universalRef,
89
+ type: 'slide'
90
+ },
91
+ content: {
92
+ ref: freeTextSlide.universalRef,
93
+ type: 'slide'
94
+ },
95
+ pendingSlides: [],
96
+ slides: [freeTextSlide.universalRef],
97
+ step: {
98
+ current: 2
99
+ },
100
+ stars: 8
101
+ }
74
102
  },
75
- engine: {
76
- ref: 'review'
103
+ _a[qcmGraphicSlide.universalRef] = {
104
+ _id: '62b1d1087aa12f00253f40ee',
105
+ content: content,
106
+ engine: engine,
107
+ state: {
108
+ allAnswers: [
109
+ {
110
+ slideRef: freeTextSlide.universalRef,
111
+ isCorrect: true,
112
+ answer: ['Benchmark']
113
+ },
114
+ {
115
+ slideRef: qcmGraphicSlide.universalRef,
116
+ isCorrect: true,
117
+ answer: ['Faux']
118
+ }
119
+ ],
120
+ isCorrect: true,
121
+ nextContent: {
122
+ ref: qcmSlide.universalRef,
123
+ type: 'slide'
124
+ },
125
+ content: {
126
+ ref: qcmGraphicSlide.universalRef,
127
+ type: 'slide'
128
+ },
129
+ pendingSlides: [],
130
+ slides: [freeTextSlide.universalRef, qcmGraphicSlide.universalRef],
131
+ step: {
132
+ current: 3
133
+ },
134
+ stars: 16
135
+ }
136
+ },
137
+ _a[qcmSlide.universalRef] = {
138
+ _id: '62b1d1087aa12f00253f40ee',
139
+ content: content,
140
+ engine: engine,
141
+ state: {
142
+ allAnswers: [
143
+ {
144
+ slideRef: freeTextSlide.universalRef,
145
+ isCorrect: true,
146
+ answer: ['Benchmark']
147
+ },
148
+ {
149
+ slideRef: qcmGraphicSlide.universalRef,
150
+ isCorrect: true,
151
+ answer: ['Faux']
152
+ },
153
+ {
154
+ slideRef: qcmSlide.universalRef,
155
+ isCorrect: true,
156
+ answer: ['Le créateur peut fixer un pourcentage pour chaque transaction future']
157
+ }
158
+ ],
159
+ isCorrect: true,
160
+ nextContent: {
161
+ ref: sliderSlide.universalRef,
162
+ type: 'slide'
163
+ },
164
+ content: {
165
+ ref: qcmSlide.universalRef,
166
+ type: 'slide'
167
+ },
168
+ pendingSlides: [],
169
+ slides: [freeTextSlide.universalRef, qcmGraphicSlide.universalRef, qcmSlide.universalRef],
170
+ step: {
171
+ current: 4
172
+ },
173
+ stars: 24
174
+ }
175
+ },
176
+ _a[sliderSlide.universalRef] = {
177
+ _id: '62b1d1087aa12f00253f40ee',
178
+ content: content,
179
+ engine: engine,
180
+ state: {
181
+ allAnswers: [
182
+ {
183
+ slideRef: freeTextSlide.universalRef,
184
+ isCorrect: true,
185
+ answer: ['Benchmark']
186
+ },
187
+ {
188
+ slideRef: qcmGraphicSlide.universalRef,
189
+ isCorrect: true,
190
+ answer: ['Faux']
191
+ },
192
+ {
193
+ slideRef: qcmSlide.universalRef,
194
+ isCorrect: true,
195
+ answer: ['Le créateur peut fixer un pourcentage pour chaque transaction future']
196
+ },
197
+ {
198
+ slideRef: sliderSlide.universalRef,
199
+ isCorrect: true,
200
+ answer: ['7']
201
+ }
202
+ ],
203
+ isCorrect: true,
204
+ nextContent: {
205
+ ref: templateSlide.universalRef,
206
+ type: 'slide'
207
+ },
208
+ content: {
209
+ ref: sliderSlide.universalRef,
210
+ type: 'slide'
211
+ },
212
+ pendingSlides: [],
213
+ slides: [
214
+ freeTextSlide.universalRef,
215
+ qcmGraphicSlide.universalRef,
216
+ qcmSlide.universalRef,
217
+ sliderSlide.universalRef
218
+ ],
219
+ step: {
220
+ current: 5
221
+ },
222
+ stars: 32
223
+ }
224
+ },
225
+ _a[templateSlide.universalRef] = {
226
+ _id: '62b1d1087aa12f00253f40ee',
227
+ content: content,
228
+ engine: engine,
229
+ state: {
230
+ allAnswers: [
231
+ {
232
+ slideRef: freeTextSlide.universalRef,
233
+ isCorrect: true,
234
+ answer: ['Benchmark']
235
+ },
236
+ {
237
+ slideRef: qcmGraphicSlide.universalRef,
238
+ isCorrect: true,
239
+ answer: ['Faux']
240
+ },
241
+ {
242
+ slideRef: qcmSlide.universalRef,
243
+ isCorrect: true,
244
+ answer: ['Le créateur peut fixer un pourcentage pour chaque transaction future']
245
+ },
246
+ {
247
+ slideRef: sliderSlide.universalRef,
248
+ isCorrect: true,
249
+ answer: ['7']
250
+ },
251
+ {
252
+ slideRef: templateSlide.universalRef,
253
+ isCorrect: true,
254
+ answer: ['Leaderboard', 'utilisateurs', 'étoiles']
255
+ }
256
+ ],
257
+ isCorrect: true,
258
+ nextContent: {
259
+ ref: 'successExitNode',
260
+ type: 'success'
261
+ },
262
+ content: {
263
+ ref: templateSlide.universalRef,
264
+ type: 'slide'
265
+ },
266
+ pendingSlides: [],
267
+ slides: [
268
+ freeTextSlide.universalRef,
269
+ qcmGraphicSlide.universalRef,
270
+ qcmSlide.universalRef,
271
+ sliderSlide.universalRef,
272
+ templateSlide.universalRef
273
+ ],
274
+ step: {
275
+ current: 6
276
+ },
277
+ stars: 40
278
+ }
77
279
  },
280
+ _a);
281
+ export var progressionSlideWithPendingSlide = {
282
+ _id: '62b1d1087aa12f00253f40ee',
283
+ content: content,
284
+ engine: engine,
78
285
  state: {
79
286
  allAnswers: [
80
287
  {
81
- slideRef: 'sli_VJYjJnJhg',
288
+ slideRef: freeTextSlide.universalRef,
289
+ isCorrect: false,
290
+ answer: ['Wrong']
291
+ },
292
+ {
293
+ slideRef: qcmGraphicSlide.universalRef,
294
+ isCorrect: true,
295
+ answer: ['Faux']
296
+ },
297
+ {
298
+ slideRef: qcmSlide.universalRef,
299
+ isCorrect: false,
300
+ answer: ['Wrong']
301
+ },
302
+ {
303
+ slideRef: sliderSlide.universalRef,
304
+ isCorrect: true,
305
+ answer: ['7']
306
+ },
307
+ {
308
+ slideRef: templateSlide.universalRef,
309
+ isCorrect: true,
310
+ answer: ['Leaderboard', 'utilisateurs', 'étoiles']
311
+ },
312
+ {
313
+ slideRef: freeTextSlide.universalRef,
82
314
  isCorrect: true,
83
315
  answer: ['Benchmark']
84
316
  }
85
317
  ],
86
318
  isCorrect: true,
87
319
  nextContent: {
88
- ref: 'sli_VkSQroQnx',
320
+ ref: qcmSlide.universalRef,
89
321
  type: 'slide'
90
322
  },
91
323
  content: {
92
- ref: 'sli_VJYjJnJhg',
324
+ ref: freeTextSlide.universalRef,
93
325
  type: 'slide'
94
326
  },
95
- pendingSlides: [],
96
- slides: ['sli_VJYjJnJhg'],
327
+ pendingSlides: [qcmSlide.universalRef],
328
+ slides: [
329
+ freeTextSlide.universalRef,
330
+ qcmGraphicSlide.universalRef,
331
+ qcmSlide.universalRef,
332
+ sliderSlide.universalRef,
333
+ templateSlide.universalRef,
334
+ freeTextSlide.universalRef
335
+ ],
97
336
  step: {
98
- current: 2
337
+ current: 7
99
338
  },
100
- stars: 4
339
+ stars: 32
101
340
  }
102
341
  };
103
342
  export var services = {
104
343
  fetchSkills: function () { return Promise.resolve(fetchSkillsResponse); },
105
344
  fetchSlide: function (ref) { return Promise.resolve(__assign(__assign({}, getSlideFixture(ref)), { universalRef: ref, id: ref })); },
106
345
  postProgression: function () { return Promise.resolve(postProgressionResponse); },
107
- postAnswer: function () { return Promise.resolve(postAnswerResponse); }
346
+ postAnswer: function (progression) {
347
+ var currentSlide = progression.state.nextContent.ref;
348
+ return Promise.resolve(get(currentSlide, postAnswerResponses));
349
+ }
108
350
  };
@@ -74,7 +74,7 @@ export declare type SlideFromAPI = {
74
74
  type: 'chapter' | 'course';
75
75
  };
76
76
  };
77
- declare type ProgressionAnswerItem = {
77
+ export declare type ProgressionAnswerItem = {
78
78
  isCorrect: boolean;
79
79
  slideRef: string;
80
80
  answer: string[];
@@ -97,15 +97,17 @@ export declare type ProgressionState = {
97
97
  };
98
98
  stars: number;
99
99
  };
100
+ export declare type ReviewContent = {
101
+ type: 'skill';
102
+ ref: string;
103
+ };
104
+ export declare type ReviewEngine = {
105
+ ref: 'review';
106
+ };
100
107
  export declare type ProgressionFromAPI = {
101
108
  _id: string;
102
- content: {
103
- type: 'skill';
104
- ref: string;
105
- };
106
- engine: {
107
- ref: 'review';
108
- };
109
+ content: ReviewContent;
110
+ engine: ReviewEngine;
109
111
  state: ProgressionState;
110
112
  };
111
113
  export declare type Skill = {
@@ -118,7 +120,7 @@ export declare type Services = {
118
120
  fetchSkills(token: string): Promise<Skill[]>;
119
121
  fetchSlide(slideRef: string, token: string): Promise<SlideFromAPI | void>;
120
122
  postProgression(skillRef: string, token: string): Promise<ProgressionFromAPI>;
121
- postAnswer(skillRef: string, token: string, progressionId: string, answer: string[]): Promise<ProgressionFromAPI>;
123
+ postAnswer(progression: ProgressionFromAPI, token: string, answer: string[]): Promise<ProgressionFromAPI>;
122
124
  };
123
125
  export declare type Options = {
124
126
  services: Services;
@@ -86,5 +86,6 @@ export declare type SlidesViewProps = {
86
86
  };
87
87
  };
88
88
  export declare const initialState: SlidesStack;
89
+ export declare const buildStepItems: (state: StoreState) => StepItem[];
89
90
  export declare const mapStateToSlidesProps: (state: StoreState, dispatch: Dispatch) => SlidesViewProps;
90
91
  export {};
@@ -10,9 +10,10 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import concat from 'lodash/fp/concat';
13
+ import findLast from 'lodash/fp/findLast';
13
14
  import get from 'lodash/fp/get';
14
15
  import getOr from 'lodash/fp/getOr';
15
- import isEmpty from 'lodash/fp/isEmpty';
16
+ import last from 'lodash/fp/last';
16
17
  import pipe from 'lodash/fp/pipe';
17
18
  import reduce from 'lodash/fp/reduce';
18
19
  import set from 'lodash/fp/set';
@@ -84,7 +85,14 @@ var buildStackSlides = function (state, dispatch) {
84
85
  }, initialState, initialState);
85
86
  return stack;
86
87
  };
87
- var buildStepItems = function (state) {
88
+ var getIconForCurrentStep = function (slideRef, lastGivenAnswerForSlide, currentSlideRef, lastGivenAsnswer) {
89
+ if (slideRef !== currentSlideRef)
90
+ return lastGivenAnswerForSlide.isCorrect ? 'right' : 'wrong';
91
+ if (lastGivenAsnswer.slideRef !== slideRef)
92
+ return 'no-answer';
93
+ return lastGivenAnswerForSlide.isCorrect ? 'right' : 'wrong';
94
+ };
95
+ export var buildStepItems = function (state) {
88
96
  var progression = state.data.progression;
89
97
  var currentSlideRef = state.ui.currentSlideRef;
90
98
  if (!progression)
@@ -116,16 +124,24 @@ var buildStepItems = function (state) {
116
124
  value: '5'
117
125
  }
118
126
  ];
127
+ var slideRefs = getProgressionSlidesRefs(progression);
119
128
  var allAnswers = progression.state.allAnswers;
120
129
  var step = progression.state.step;
121
- if (isEmpty(allAnswers))
130
+ var nextContentRef = progression.state.nextContent.ref;
131
+ var lastGivenAnswer = last(allAnswers);
132
+ if (!lastGivenAnswer)
122
133
  return defaultProps;
123
134
  var steps = defaultProps.map(function (stepItem, index) {
124
- var givenAnswer = allAnswers[index];
125
- if (!givenAnswer) {
126
- return __assign(__assign({}, stepItem), { current: step.current === index + 1 });
135
+ var slideRef = slideRefs[index];
136
+ if (!slideRef)
137
+ return stepItem; // non fecthed slide pour given index
138
+ var lastGivenAnswerForSlide = findLast(function (answer) { return answer.slideRef === slideRef; }, allAnswers);
139
+ // never answered slide
140
+ if (!lastGivenAnswerForSlide) {
141
+ return __assign(__assign({}, stepItem), { current: nextContentRef === currentSlideRef && step.current === index + 1 });
127
142
  }
128
- return __assign(__assign({}, stepItem), { icon: givenAnswer.isCorrect ? 'right' : 'wrong', current: givenAnswer.slideRef === currentSlideRef });
143
+ // already answered slide, we computed based on the lastGivenAnswer
144
+ return __assign(__assign({}, stepItem), { icon: getIconForCurrentStep(slideRef, lastGivenAnswerForSlide, currentSlideRef, lastGivenAnswer), current: lastGivenAnswerForSlide.slideRef === currentSlideRef });
129
145
  });
130
146
  return steps;
131
147
  };