@coorpacademy/app-review 0.1.4 → 0.1.7

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 (103) hide show
  1. package/es/actions/data/progression.d.ts +30 -0
  2. package/es/actions/data/progression.js +12 -0
  3. package/es/actions/data/slides.d.ts +19 -15
  4. package/es/actions/data/slides.js +5 -0
  5. package/es/actions/data/token.d.ts +2 -2
  6. package/es/actions/data/token.js +1 -1
  7. package/es/actions/index.d.ts +2 -1
  8. package/es/configure-store.d.ts +2 -10
  9. package/es/configure-store.js +2 -1
  10. package/es/index.d.ts +1 -1
  11. package/es/index.js +43 -26
  12. package/es/index.test.js +5 -5
  13. package/es/middlewares/on-receive-progression.d.ts +6 -0
  14. package/es/middlewares/on-receive-progression.js +22 -0
  15. package/es/middlewares/on-receive-progression.test.d.ts +1 -0
  16. package/es/middlewares/on-receive-progression.test.js +43 -0
  17. package/es/middlewares/on-start-app.js +13 -5
  18. package/es/middlewares/on-start-app.test.d.ts +1 -0
  19. package/es/middlewares/on-start-app.test.js +53 -0
  20. package/es/reducers/data/index.d.ts +1 -1
  21. package/es/reducers/data/progression.d.ts +14 -8
  22. package/es/reducers/data/progression.js +17 -54
  23. package/es/reducers/data/slides.js +11 -6
  24. package/es/reducers/index.d.ts +1 -1
  25. package/es/services/fetch-skills.js +1 -2
  26. package/es/services/fetch-slide.d.ts +8 -0
  27. package/es/services/fetch-slide.js +26 -0
  28. package/es/services/post-progression.d.ts +8 -0
  29. package/es/services/post-progression.js +33 -0
  30. package/es/services/post-progression.mock.d.ts +5 -0
  31. package/es/services/post-progression.mock.js +31 -0
  32. package/es/services/post-progression.test.d.ts +1 -0
  33. package/es/services/post-progression.test.js +30 -0
  34. package/es/services/tools/fetch-responses.d.ts +1 -1
  35. package/es/services/tools/sleep.d.ts +1 -0
  36. package/es/services/tools/sleep.js +3 -0
  37. package/es/types/common.d.ts +8 -2
  38. package/es/types/ui-progression.d.ts +10 -0
  39. package/es/types/ui-progression.js +1 -0
  40. package/lib/actions/data/progression.d.ts +30 -0
  41. package/lib/actions/data/progression.js +12 -0
  42. package/lib/actions/data/slides.d.ts +19 -15
  43. package/lib/actions/data/slides.js +5 -0
  44. package/lib/actions/data/token.d.ts +2 -2
  45. package/lib/actions/data/token.js +1 -1
  46. package/lib/actions/index.d.ts +2 -1
  47. package/lib/configure-store.d.ts +2 -10
  48. package/lib/configure-store.js +2 -1
  49. package/lib/index.d.ts +1 -1
  50. package/lib/index.js +43 -26
  51. package/lib/index.test.js +5 -7
  52. package/lib/middlewares/on-receive-progression.d.ts +6 -0
  53. package/lib/middlewares/on-receive-progression.js +27 -0
  54. package/lib/middlewares/on-receive-progression.test.d.ts +1 -0
  55. package/lib/middlewares/on-receive-progression.test.js +88 -0
  56. package/lib/middlewares/on-start-app.js +15 -7
  57. package/lib/middlewares/on-start-app.test.d.ts +1 -0
  58. package/lib/middlewares/on-start-app.test.js +98 -0
  59. package/lib/reducers/data/index.d.ts +1 -1
  60. package/lib/reducers/data/progression.d.ts +14 -8
  61. package/lib/reducers/data/progression.js +17 -54
  62. package/lib/reducers/data/slides.js +11 -6
  63. package/lib/reducers/index.d.ts +1 -1
  64. package/lib/services/fetch-skills.js +2 -5
  65. package/lib/services/fetch-slide.d.ts +8 -0
  66. package/lib/services/fetch-slide.js +64 -0
  67. package/lib/services/post-progression.d.ts +8 -0
  68. package/lib/services/post-progression.js +77 -0
  69. package/lib/services/post-progression.mock.d.ts +5 -0
  70. package/lib/services/post-progression.mock.js +31 -0
  71. package/lib/services/post-progression.test.d.ts +1 -0
  72. package/lib/services/post-progression.test.js +84 -0
  73. package/lib/services/tools/fetch-responses.d.ts +1 -1
  74. package/lib/services/tools/sleep.d.ts +1 -0
  75. package/lib/services/tools/sleep.js +5 -0
  76. package/lib/types/common.d.ts +8 -2
  77. package/lib/types/ui-progression.d.ts +10 -0
  78. package/lib/types/ui-progression.js +1 -0
  79. package/package.json +4 -5
  80. package/readme.md +4 -5
  81. package/src/actions/data/progression.ts +50 -0
  82. package/src/actions/data/slides.ts +25 -17
  83. package/src/actions/data/token.ts +2 -2
  84. package/src/actions/index.ts +4 -1
  85. package/src/configure-store.ts +5 -13
  86. package/src/index.test.tsx +5 -7
  87. package/src/index.tsx +54 -29
  88. package/src/middlewares/on-receive-progression.test.ts +60 -0
  89. package/src/middlewares/on-receive-progression.ts +42 -0
  90. package/src/middlewares/on-start-app.test.ts +68 -0
  91. package/src/middlewares/on-start-app.ts +13 -5
  92. package/src/reducers/data/progression.ts +34 -69
  93. package/src/reducers/data/slides.ts +13 -8
  94. package/src/services/fetch-skills.ts +1 -2
  95. package/src/services/fetch-slide.ts +43 -0
  96. package/src/services/post-progression.mock.ts +35 -0
  97. package/src/services/post-progression.test.ts +41 -0
  98. package/src/services/post-progression.ts +50 -0
  99. package/src/services/tools/fetch-responses.ts +1 -1
  100. package/src/services/tools/sleep.ts +4 -0
  101. package/src/types/common.ts +8 -2
  102. package/src/types/globals.d.ts +1 -0
  103. package/src/types/ui-progression.ts +25 -0
@@ -0,0 +1,27 @@
1
+ import get from 'lodash/fp/get';
2
+ // eslint-disable-next-line import/no-named-as-default
3
+ import fetchSlide from '../services/fetch-slide';
4
+ import { errorFetchingSlide, storeFirstSlide } from '../actions/data/slides';
5
+ import { RECEIVE_PROGRESSION } from '../actions/data/progression';
6
+ var onReceiveProgression = function (_a) {
7
+ var dispatch = _a.dispatch;
8
+ return function (next) {
9
+ return function (action) {
10
+ if (action.type === RECEIVE_PROGRESSION) {
11
+ var _a = action.payload, progression = _a.progression, token = _a.token;
12
+ var slideRef = get('state.nextContent.ref', progression);
13
+ // TOASK: do we need to check for exit nodes before fetching??
14
+ // TODO: To implement fetchSlide in next ticket
15
+ fetchSlide(slideRef, token)
16
+ .then(function (slide) {
17
+ return dispatch(storeFirstSlide(slide));
18
+ })
19
+ .catch(function (err) {
20
+ return dispatch(errorFetchingSlide(err));
21
+ });
22
+ }
23
+ return next(action);
24
+ };
25
+ };
26
+ };
27
+ export default onReceiveProgression;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import test from 'ava';
38
+ import { receiveProgression } from '../actions/data/progression';
39
+ import { mockedProgression } from '../services/post-progression.mock';
40
+ import { sleep } from '../services/tools/sleep';
41
+ import { STORE_FIRST_SLIDE } from '../actions/data/slides';
42
+ import onReceiveProgression from './on-receive-progression';
43
+ var appOptions = {
44
+ token: process.env.API_TEST_TOKEN || ''
45
+ };
46
+ var otherAction = function (payload) { return ({
47
+ type: '@@other/OTHER',
48
+ payload: payload
49
+ }); };
50
+ test('should not dispatch anything if action is not RECEIVE_PROGRESSION', function (t) {
51
+ t.plan(1);
52
+ var dispatch = function () {
53
+ t.fail();
54
+ };
55
+ var next = function () {
56
+ return t.pass();
57
+ };
58
+ onReceiveProgression({ dispatch: dispatch })(next)(otherAction('other'));
59
+ });
60
+ test('should dispatch actions: STORE_FIRST_SLIDE', function (t) { return __awaiter(void 0, void 0, void 0, function () {
61
+ var dispatch, next;
62
+ return __generator(this, function (_a) {
63
+ switch (_a.label) {
64
+ case 0:
65
+ t.plan(2);
66
+ dispatch = function (action) {
67
+ switch (action.type) {
68
+ case STORE_FIRST_SLIDE: {
69
+ var slide = action.payload;
70
+ t.deepEqual(slide, {});
71
+ return;
72
+ }
73
+ default:
74
+ t.fail();
75
+ break;
76
+ }
77
+ };
78
+ next = function () {
79
+ return t.pass();
80
+ };
81
+ onReceiveProgression({ dispatch: dispatch })(next)(receiveProgression({ token: appOptions.token, progression: mockedProgression }));
82
+ return [4 /*yield*/, sleep(1000)];
83
+ case 1:
84
+ _a.sent(); // wait for the .then to fire
85
+ return [2 /*return*/];
86
+ }
87
+ });
88
+ }); });
@@ -1,22 +1,30 @@
1
1
  import { VIEWS } from '../common';
2
2
  import { storeToken } from '../actions/data/token';
3
3
  import { receivedSkills, errorFetchingSkills } from '../actions/data/skills';
4
- import { storeFirstSlide } from '../actions/data/slides';
5
4
  import { navigateTo, START_APP } from '../actions/ui/navigation';
6
5
  // eslint-disable-next-line import/no-named-as-default
7
6
  import fetchSkills from '../services/fetch-skills';
7
+ // eslint-disable-next-line import/no-named-as-default
8
+ import postProgression from '../services/post-progression';
9
+ import { errorCreatingProgression, receiveProgression } from '../actions/data/progression';
8
10
  var onStartApp = function (_a) {
9
11
  var dispatch = _a.dispatch;
10
12
  return function (next) {
11
13
  return function (action) {
12
14
  if (action.type === START_APP) {
13
- var _a = action.payload, slide = _a.slide, token = _a.token;
14
- dispatch(storeToken(token));
15
- if (slide) {
16
- dispatch(storeFirstSlide(slide));
15
+ var _a = action.payload, skillRef = _a.skillRef, token_1 = _a.token;
16
+ dispatch(storeToken(token_1));
17
+ if (skillRef) {
18
+ postProgression(skillRef, token_1)
19
+ .then(function (progression) {
20
+ return dispatch(receiveProgression({ progression: progression, token: token_1 }));
21
+ })
22
+ .catch(function (err) {
23
+ return dispatch(errorCreatingProgression(err));
24
+ });
17
25
  }
18
26
  else {
19
- fetchSkills(token)
27
+ fetchSkills(token_1)
20
28
  .then(function (skills) {
21
29
  return dispatch(receivedSkills(skills));
22
30
  })
@@ -24,7 +32,7 @@ var onStartApp = function (_a) {
24
32
  return dispatch(errorFetchingSkills(err));
25
33
  });
26
34
  }
27
- var initialView = slide ? VIEWS.slides : VIEWS.skills;
35
+ var initialView = skillRef ? VIEWS.slides : VIEWS.skills;
28
36
  dispatch(navigateTo(initialView));
29
37
  }
30
38
  return next(action);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,98 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import test from 'ava';
38
+ import { STORE_TOKEN } from '../actions/data/token';
39
+ import { RECEIVE_PROGRESSION } from '../actions/data/progression';
40
+ import { NAVIGATE_TO, startApp } from '../actions/ui/navigation';
41
+ import { mockedProgression } from '../services/post-progression.mock';
42
+ import { VIEWS } from '../common';
43
+ import { sleep } from '../services/tools/sleep';
44
+ import onStartApp from './on-start-app';
45
+ var appOptions = {
46
+ token: process.env.API_TEST_TOKEN || '',
47
+ skillRef: 'skill_NJC0jFKoH'
48
+ };
49
+ var otherAction = function (payload) { return ({
50
+ type: '@@other/OTHER',
51
+ payload: payload
52
+ }); };
53
+ test('should not dispatch anything if action is not START_APP', function (t) {
54
+ t.plan(1);
55
+ var dispatch = function () {
56
+ t.fail();
57
+ };
58
+ var next = function () {
59
+ return t.pass();
60
+ };
61
+ onStartApp({ dispatch: dispatch })(next)(otherAction('other'));
62
+ });
63
+ test('should dispatch actions: STORE_TOKEN && RECEIVE_PROGRESSION if an skillRef is given, on a successful response', function (t) { return __awaiter(void 0, void 0, void 0, function () {
64
+ var dispatch, next;
65
+ return __generator(this, function (_a) {
66
+ switch (_a.label) {
67
+ case 0:
68
+ t.plan(5);
69
+ dispatch = function (action) {
70
+ switch (action.type) {
71
+ case STORE_TOKEN:
72
+ t.is(action.payload, appOptions.token);
73
+ return;
74
+ case RECEIVE_PROGRESSION: {
75
+ var _a = action.payload, token = _a.token, progression = _a.progression;
76
+ t.is(token, appOptions.token);
77
+ t.deepEqual(progression, JSON.parse(JSON.stringify(mockedProgression)));
78
+ return;
79
+ }
80
+ case NAVIGATE_TO:
81
+ t.is(action.payload, VIEWS.slides);
82
+ return;
83
+ default:
84
+ t.fail();
85
+ break;
86
+ }
87
+ };
88
+ next = function () {
89
+ return t.pass();
90
+ };
91
+ onStartApp({ dispatch: dispatch })(next)(startApp(appOptions));
92
+ return [4 /*yield*/, sleep(1000)];
93
+ case 1:
94
+ _a.sent(); // wait for the .then to fire
95
+ return [2 /*return*/];
96
+ }
97
+ });
98
+ }); });
@@ -3,5 +3,5 @@ declare const _default: import("redux").Reducer<import("redux").CombinedState<{
3
3
  skills: import("../../types/skills").Skills;
4
4
  slides: import("./slides").SlidesState;
5
5
  token: import("./token").TokenState;
6
- }>, import("../../actions/data/slides").ValidateSlide | import("../../actions/data/slides").SlidesAction | import("../../actions/data/skills").ReceivedSkills | import("../../actions/data/token").StoreToken>;
6
+ }>, import("../../actions/data/progression").ReceiveProgression | import("../../actions/data/slides").ValidateSlide | import("../../actions/data/slides").SlidesAction | import("../../actions/data/skills").ReceivedSkills | import("../../actions/data/token").StoreToken>;
7
7
  export default _default;
@@ -1,14 +1,20 @@
1
+ import { ReceiveProgression } from '../../actions/data/progression';
1
2
  import { ValidateSlide } from '../../actions/data/slides';
2
- import { AnswerUI } from '../../types/slides';
3
3
  export declare type ProgressionState = {
4
- slideNumber: number;
5
- isCorrect?: boolean;
6
- exitNode?: 'successExitNode' | 'failExitNode';
7
- nextSlide?: {
8
- questionText?: string;
9
- answerUI?: AnswerUI;
4
+ _id?: string;
5
+ state: {
6
+ isCorrect: boolean;
7
+ nextContent: {
8
+ ref: 'successExitNode' | string;
9
+ type: 'success' | 'slide';
10
+ };
11
+ pendingSlides: string[];
12
+ step: {
13
+ current: number;
14
+ };
10
15
  };
16
+ slideNumber?: number;
11
17
  } | null;
12
18
  export declare const initialState: ProgressionState;
13
- declare const reducer: (state: ProgressionState | undefined, action: ValidateSlide) => ProgressionState;
19
+ declare const reducer: (state: ProgressionState | undefined, action: ValidateSlide | ReceiveProgression) => ProgressionState;
14
20
  export default reducer;
@@ -1,4 +1,5 @@
1
- import { getOr, noop } from 'lodash/fp';
1
+ import { getOr } from 'lodash/fp';
2
+ import { RECEIVE_PROGRESSION } from '../../actions/data/progression';
2
3
  import { VALIDATE_SLIDE } from '../../actions/data/slides';
3
4
  // -----------------------------------------------------------------------------
4
5
  export var initialState = null;
@@ -11,66 +12,28 @@ state, action) {
11
12
  case VALIDATE_SLIDE: {
12
13
  var previousSlideNumber = getOr(-1, 'slideNumber', state);
13
14
  // hard coded for now
15
+ // TODO: fix on VALIDATE ticket
14
16
  return {
17
+ _id: '1234',
15
18
  // virtual field
16
19
  slideNumber: previousSlideNumber + 1,
17
- isCorrect: true,
18
- // exitNode
19
- // TODO: create another action, to retrieve the next slide
20
- // nextSlide should be corrected to nextContent, when this new action is created
21
- // ex: nextContent: {ref: "sli_E1n2i2sBo", type: "slide"}
22
- // the middleware should trigger a next content request once the result is
23
- // received && update the state accordingly,
24
- //
25
- nextSlide: {
26
- questionText: 'Test',
27
- answerUI: {
28
- model: {
29
- answers: [
30
- {
31
- title: 'There is no need for a password',
32
- // TODO: onClick of each answer should use a dispatcher to
33
- // update selected answers (in order to use them on validation)
34
- // in each retrieval, the answers of answerUI need to be augmented
35
- // for the onClick prop to achieve this.
36
- onClick: noop,
37
- selected: false,
38
- help: 'help'
39
- },
40
- {
41
- title: 'Lorem ipsum',
42
- onClick: noop,
43
- selected: false,
44
- help: 'help'
45
- },
46
- {
47
- title: 'Lorem',
48
- onClick: noop,
49
- selected: true,
50
- order: 1,
51
- help: 'help'
52
- },
53
- {
54
- title: 'You need to have a password',
55
- onClick: noop,
56
- selected: false,
57
- help: 'help'
58
- },
59
- {
60
- title: 'Pouet',
61
- onClick: noop,
62
- selected: true,
63
- order: 0,
64
- help: 'help'
65
- }
66
- ],
67
- type: 'qcmDrag'
68
- },
69
- help: 'Help text will appear here'
20
+ state: {
21
+ pendingSlides: [],
22
+ step: {
23
+ current: Number.NaN
24
+ },
25
+ isCorrect: true,
26
+ nextContent: {
27
+ ref: 'sli_V1gKpYYZ2',
28
+ type: 'slide'
70
29
  }
71
30
  }
72
31
  };
73
32
  }
33
+ case RECEIVE_PROGRESSION: {
34
+ var progression = action.payload.progression;
35
+ return progression;
36
+ }
74
37
  default:
75
38
  return state;
76
39
  }
@@ -12,6 +12,7 @@ var __assign = (this && this.__assign) || function () {
12
12
  import map from 'lodash/fp/map';
13
13
  import { STORE_FIRST_SLIDE, UPDATE_SLIDES_ON_NEXT, UPDATE_SLIDES_ON_VALIDATION } from '../../actions/data/slides';
14
14
  import { HIGHEST_INDEX, slideNumbers, TOTAL_SLIDES_STACK } from '../../common';
15
+ import { slide as qcmSlide } from '../../fixtures/qcm-slide';
15
16
  // -----------------------------------------------------------------------------
16
17
  var getInitialState = function () {
17
18
  var state = {
@@ -41,7 +42,7 @@ var setFirstSlide = function (state, slide) {
41
42
  // ||-------> Handles the updates of a given slide on validation,
42
43
  // & then updates de remaining slides if this given change should impact their content
43
44
  var stateUpdateOnValidation = function (state, payload) {
44
- var slideNumber = payload.slideNumber, newSlideContent = payload.newSlideContent, numberOfFinishedSlides = payload.numberOfFinishedSlides, nextSlide = payload.nextSlide;
45
+ var slideNumber = payload.slideNumber, newSlideContent = payload.newSlideContent, numberOfFinishedSlides = payload.numberOfFinishedSlides, nextContent = payload.nextContent;
45
46
  var _state = {
46
47
  slideNumbers: slideNumbers
47
48
  };
@@ -52,7 +53,7 @@ var stateUpdateOnValidation = function (state, payload) {
52
53
  if (index === slideNumber) {
53
54
  // only one slide remaining, presets the next value
54
55
  if (numberOfFinishedSlides === HIGHEST_INDEX) {
55
- _state[index] = __assign(__assign({}, previousValue), { nextSlide: nextSlide, position: newSlideContent.position, isCorrect: newSlideContent.isCorrect });
56
+ _state[index] = __assign(__assign({}, previousValue), { nextContent: nextContent, position: newSlideContent.position, isCorrect: newSlideContent.isCorrect });
56
57
  }
57
58
  else
58
59
  _state[slideNumber] = __assign(__assign({}, previousValue), newSlideContent);
@@ -60,7 +61,7 @@ var stateUpdateOnValidation = function (state, payload) {
60
61
  else {
61
62
  // updates the rest of the slides here
62
63
  var hidden = previousValue.hidden, position = previousValue.position;
63
- _state[index] = __assign(__assign({}, nextSlide), { endReview: newSlideContent.endReview, hidden: hidden, position: position });
64
+ _state[index] = __assign(__assign({}, nextContent), { endReview: newSlideContent.endReview, hidden: hidden, position: position });
64
65
  }
65
66
  }, state.slideNumbers);
66
67
  return _state;
@@ -78,8 +79,8 @@ var stateUpdateOnNext = function (state, payload) {
78
79
  // the current slide
79
80
  if (index === slideNumber) {
80
81
  // when there is only one slide remaining, updates the slide value
81
- if (numberOfFinishedSlides === HIGHEST_INDEX && previousValue.nextSlide) {
82
- _state[index] = __assign(__assign({}, previousValue.nextSlide), { position: previousValue.position });
82
+ if (numberOfFinishedSlides === HIGHEST_INDEX && previousValue.nextContent) {
83
+ _state[index] = __assign(__assign({}, previousValue.nextContent), { position: previousValue.position });
83
84
  }
84
85
  else
85
86
  _state[slideNumber] = newSlideContent;
@@ -104,7 +105,11 @@ var reducer = function (state, action) {
104
105
  if (state === void 0) { state = initialState; }
105
106
  switch (action.type) {
106
107
  case STORE_FIRST_SLIDE: {
107
- return setFirstSlide(state, action.payload);
108
+ // TODO: An intermediate slide transform is needed here (or in fetchSlide)
109
+ // const apiSlide = action.payload;
110
+ // apiSlide adapt to uiSlide
111
+ var uiSlide = qcmSlide;
112
+ return setFirstSlide(state, uiSlide);
108
113
  }
109
114
  case UPDATE_SLIDES_ON_VALIDATION: {
110
115
  return stateUpdateOnValidation(state, action.payload);
@@ -11,5 +11,5 @@ declare const _default: import("redux").Reducer<import("redux").CombinedState<{
11
11
  reviewStatus: import("./ui/review-status").ReviewStatusState;
12
12
  stepItems: import("./ui/step-items").StepItems;
13
13
  }>;
14
- }>, import("../actions/data/slides").ValidateSlide | import("../actions/data/slides").SlidesAction | import("../actions/data/skills").ReceivedSkills | import("../actions/data/token").StoreToken | import("../actions/ui/finished-slides").UpdateFinishedSlides | import("../actions/ui/navigation").NavigateTo | import("../actions/ui/navigation").NavigateBack | import("../actions/ui/review-status").UpdateReviewStatus | import("../actions/ui/step-items").StepItemsAction>;
14
+ }>, import("../actions/data/progression").ReceiveProgression | import("../actions/data/slides").ValidateSlide | import("../actions/data/slides").SlidesAction | import("../actions/data/skills").ReceivedSkills | import("../actions/data/token").StoreToken | import("../actions/ui/finished-slides").UpdateFinishedSlides | import("../actions/ui/navigation").NavigateTo | import("../actions/ui/navigation").NavigateBack | import("../actions/ui/review-status").UpdateReviewStatus | import("../actions/ui/step-items").StepItemsAction>;
15
15
  export default _default;
@@ -40,7 +40,7 @@ import { toJSON } from './tools/fetch-responses';
40
40
  import mockFetchSkills from './fetch-skills.mock';
41
41
  // -----------------------------------------------------------------------------
42
42
  var fetchSkills = function (fetch) { return function (token) { return __awaiter(void 0, void 0, void 0, function () {
43
- var _a, userId, host, response, skills;
43
+ var _a, userId, host, response;
44
44
  return __generator(this, function (_b) {
45
45
  switch (_b.label) {
46
46
  case 0:
@@ -50,10 +50,7 @@ var fetchSkills = function (fetch) { return function (token) { return __awaiter(
50
50
  })];
51
51
  case 1:
52
52
  response = _b.sent();
53
- return [4 /*yield*/, toJSON(response)];
54
- case 2:
55
- skills = (_b.sent());
56
- return [2 /*return*/, skills];
53
+ return [2 /*return*/, toJSON(response)];
57
54
  }
58
55
  });
59
56
  }); }; };
@@ -0,0 +1,8 @@
1
+ import crossFetch from 'cross-fetch';
2
+ import { SlideFromAPI } from '../actions/data/slides';
3
+ declare type FetchSlide = (slideRef: string, token: string) => Promise<SlideFromAPI>;
4
+ declare type FetchSlideBuilder = (fetch: typeof crossFetch) => FetchSlide;
5
+ declare const fetchSlide: FetchSlideBuilder;
6
+ export { fetchSlide };
7
+ declare const _default: FetchSlide;
8
+ export default _default;
@@ -0,0 +1,64 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import crossFetch from 'cross-fetch';
38
+ // import {JWT} from '../types/common';
39
+ // import {toJSON} from './tools/fetch-responses';
40
+ import { okJSONResponse } from './tools/fetch.mocks';
41
+ // -----------------------------------------------------------------------------
42
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, unicorn/consistent-function-scoping, require-await
43
+ var fetchSlide = function (fetch) { return function (slideRef, token) { return __awaiter(void 0, void 0, void 0, function () {
44
+ return __generator(this, function (_a) {
45
+ // const {host}: JWT = decode(token);
46
+ // const response = await fetch(`${host}/api/v2/slide/${slideRef}`, {
47
+ // headers: {authorization: token}
48
+ // });
49
+ // const slide = (await toJSON(response)) as SlideFromAPI;
50
+ // return slide;
51
+ return [2 /*return*/, {}];
52
+ });
53
+ }); }; };
54
+ // -----------------------------------------------------------------------------
55
+ var createFetchSlide = function () {
56
+ if (process.env.SERVICES !== 'mocks') {
57
+ return fetchSlide(crossFetch);
58
+ }
59
+ // TODO: use an appropriate mock
60
+ return fetchSlide(okJSONResponse({}));
61
+ };
62
+ // -----------------------------------------------------------------------------
63
+ export { fetchSlide };
64
+ export default createFetchSlide();
@@ -0,0 +1,8 @@
1
+ import crossFetch from 'cross-fetch';
2
+ import { ProgressionFromAPI } from '../actions/data/progression';
3
+ declare type PostProgression = (skillRef: string, token: string) => Promise<ProgressionFromAPI>;
4
+ declare type CreatePostProgression = (fetch: typeof crossFetch) => PostProgression;
5
+ declare const postProgression: CreatePostProgression;
6
+ export { postProgression };
7
+ declare const _default: PostProgression;
8
+ export default _default;
@@ -0,0 +1,77 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import crossFetch from 'cross-fetch';
38
+ import decode from 'jwt-decode';
39
+ import { toJSON } from './tools/fetch-responses';
40
+ import mockPostProgression from './post-progression.mock';
41
+ // -----------------------------------------------------------------------------
42
+ var postProgression = function (fetch) { return function (skillRef, token) { return __awaiter(void 0, void 0, void 0, function () {
43
+ var host, response;
44
+ return __generator(this, function (_a) {
45
+ switch (_a.label) {
46
+ case 0:
47
+ host = decode(token).host;
48
+ return [4 /*yield*/, fetch("".concat(host, "/api/v2/progressions"), {
49
+ method: 'post',
50
+ headers: { authorization: token },
51
+ body: JSON.stringify({
52
+ content: {
53
+ ref: skillRef,
54
+ type: 'slide'
55
+ },
56
+ engine: {
57
+ ref: 'review',
58
+ version: '1'
59
+ }
60
+ })
61
+ })];
62
+ case 1:
63
+ response = _a.sent();
64
+ return [2 /*return*/, toJSON(response)];
65
+ }
66
+ });
67
+ }); }; };
68
+ // -----------------------------------------------------------------------------
69
+ var createPostProgression = function () {
70
+ if (process.env.SERVICES !== 'mocks') {
71
+ return postProgression(crossFetch);
72
+ }
73
+ return postProgression(mockPostProgression);
74
+ };
75
+ // -----------------------------------------------------------------------------
76
+ export { postProgression };
77
+ export default createPostProgression();