@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.
- package/es/actions/api/post-answer.js +9 -8
- package/es/actions/api/test/post-answer.test.js +6 -6
- package/es/reducers/data/test/progression.test.js +4 -3
- package/es/services/post-answer.d.ts +1 -1
- package/es/services/post-answer.js +3 -1
- package/es/services/test/post-answer.test.js +27 -4
- package/es/test/util/services.mock.d.ts +2 -1
- package/es/test/util/services.mock.js +264 -23
- package/es/types/common.d.ts +11 -9
- package/es/views/slides/index.d.ts +1 -0
- package/es/views/slides/index.js +24 -8
- package/es/views/slides/test/index.test.js +518 -203
- package/lib/actions/api/post-answer.js +10 -9
- package/lib/actions/api/test/post-answer.test.js +6 -6
- package/lib/reducers/data/test/progression.test.js +4 -3
- package/lib/services/post-answer.d.ts +1 -1
- package/lib/services/post-answer.js +4 -2
- package/lib/services/test/post-answer.test.js +27 -4
- package/lib/test/util/services.mock.d.ts +2 -1
- package/lib/test/util/services.mock.js +265 -23
- package/lib/types/common.d.ts +11 -9
- package/lib/views/slides/index.d.ts +1 -0
- package/lib/views/slides/index.js +23 -7
- package/lib/views/slides/test/index.test.js +521 -203
- package/package.json +3 -4
- package/src/actions/api/post-answer.ts +9 -9
- package/src/actions/api/test/post-answer.test.ts +6 -6
- package/src/reducers/data/test/progression.test.ts +4 -3
- package/src/services/post-answer.ts +3 -2
- package/src/services/test/post-answer.test.ts +28 -4
- package/src/test/util/services.mock.ts +274 -24
- package/src/types/common.ts +13 -10
- package/src/views/slides/index.ts +35 -10
- 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,
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
slideRef =
|
|
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 {
|
|
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:
|
|
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:
|
|
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:
|
|
107
|
+
payload: postAnswerResponses[freeTextSlide.id]
|
|
108
108
|
},
|
|
109
|
-
{ type: SLIDE_FETCH_REQUEST, meta: { slideRef:
|
|
109
|
+
{ type: SLIDE_FETCH_REQUEST, meta: { slideRef: qcmGraphicSlide.id } },
|
|
110
110
|
{
|
|
111
111
|
type: SLIDE_FETCH_SUCCESS,
|
|
112
|
-
meta: { slideRef:
|
|
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 {
|
|
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:
|
|
21
|
+
payload: postAnswerResponses[freeTextSlide.universalRef]
|
|
21
22
|
});
|
|
22
|
-
t.deepEqual(state,
|
|
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: (
|
|
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 (
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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:
|
|
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:
|
|
320
|
+
ref: qcmSlide.universalRef,
|
|
89
321
|
type: 'slide'
|
|
90
322
|
},
|
|
91
323
|
content: {
|
|
92
|
-
ref:
|
|
324
|
+
ref: freeTextSlide.universalRef,
|
|
93
325
|
type: 'slide'
|
|
94
326
|
},
|
|
95
|
-
pendingSlides: [],
|
|
96
|
-
slides: [
|
|
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:
|
|
337
|
+
current: 7
|
|
99
338
|
},
|
|
100
|
-
stars:
|
|
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 () {
|
|
346
|
+
postAnswer: function (progression) {
|
|
347
|
+
var currentSlide = progression.state.nextContent.ref;
|
|
348
|
+
return Promise.resolve(get(currentSlide, postAnswerResponses));
|
|
349
|
+
}
|
|
108
350
|
};
|
package/lib/types/common.d.ts
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
125
|
-
if (!
|
|
126
|
-
return
|
|
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
|
-
|
|
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
|
};
|