@gamelearn/arcade-components 0.22.8 → 0.22.10

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.
@@ -58,6 +58,7 @@ var CurrentImageClickPuzzle = function CurrentImageClickPuzzle(_ref) {
58
58
  selected = _ref.selected,
59
59
  setShowPoints = _ref.setShowPoints;
60
60
  var accRewards = (0, _react.useRef)([]);
61
+ var correctClicked = (0, _react.useRef)(0);
61
62
 
62
63
  var _useState = (0, _react.useState)(0),
63
64
  _useState2 = _slicedToArray(_useState, 2),
@@ -89,7 +90,8 @@ var CurrentImageClickPuzzle = function CurrentImageClickPuzzle(_ref) {
89
90
  setShowPoints([].concat(_toConsumableArray(accRewards.current), _toConsumableArray(rewards)));
90
91
  }, [playSound, emitEvent, setShowPoints]);
91
92
  var currentImageProps = list[index];
92
- var info = currentImageProps.info;
93
+ var info = currentImageProps.info,
94
+ specificFeedbacks = currentImageProps.specificFeedbacks;
93
95
  info.description = description;
94
96
  var handleResolve = (0, _react.useCallback)(function () {
95
97
  emitEvent({
@@ -101,18 +103,47 @@ var CurrentImageClickPuzzle = function CurrentImageClickPuzzle(_ref) {
101
103
  }
102
104
  });
103
105
  }, [emitEvent, puzzleId, info.resolve.rewards]);
106
+ (0, _react.useEffect)(function () {
107
+ correctClicked.current = 0;
108
+ }, [index]);
104
109
  var onComplete = (0, _react.useCallback)(function (rw) {
105
- if (index + 1 >= list.length) {
106
- handleFinish(rw);
107
- } else {
110
+ var correct = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
111
+
112
+ if (correct) {
113
+ var _specificFeedbacks$co;
114
+
115
+ if ((_specificFeedbacks$co = specificFeedbacks.correctFeedbacks) !== null && _specificFeedbacks$co !== void 0 && _specificFeedbacks$co.length && !currentImageProps.hasClickOnce) {
116
+ correctClicked.current += 1;
117
+ setSelected(selected + 1);
118
+ } else {
119
+ correctClicked.current += currentImageProps.areas.length;
120
+ setSelected(selected + currentImageProps.areas.length);
121
+ }
122
+
123
+ if (correctClicked.current === currentImageProps.areas.length) {
124
+ if (index + 1 >= list.length) {
125
+ handleFinish(rw);
126
+ } else {
127
+ setIndex(index + 1);
128
+ }
129
+ }
130
+
108
131
  setRewards(rw);
109
- setIndex(index + 1);
132
+ } else {
133
+ emitEvent({
134
+ type: 'addPoints',
135
+ payload: rw,
136
+ finish: false
137
+ });
138
+
139
+ if (currentImageProps.hasClickOrder) {
140
+ setSelected(selected - correctClicked.current);
141
+ correctClicked.current = 0;
142
+ }
110
143
  }
144
+ }, [index, list.length, currentImageProps.hasClickOrder, currentImageProps.hasClickOnce, currentImageProps.areas.length, handleFinish, specificFeedbacks, setSelected, selected, emitEvent]);
111
145
 
112
- setSelected(selected + currentImageProps.areas.length);
113
- }, [index, list.length, selected, currentImageProps.areas.length, handleFinish, setSelected]);
114
-
115
- var onResolve = function onResolve(resolve) {
146
+ var onResolve = function onResolve() {
116
147
  playSound('score');
117
148
  setTimeout(function () {
118
149
  handleResolve();
@@ -146,6 +177,7 @@ var CurrentImageClickPuzzle = function CurrentImageClickPuzzle(_ref) {
146
177
  name: puzzleId,
147
178
  component: 'chained-image-click-puzzle'
148
179
  },
180
+ specificFeedbacks: specificFeedbacks,
149
181
  emitFinish: onComplete,
150
182
  emitError: setRewards,
151
183
  emitResolve: onResolve,
@@ -3,10 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.mockProps = void 0;
6
+ exports.mockProps2 = exports.mockProps = void 0;
7
7
 
8
- var emitEvent = function emitEvent(type) {
8
+ var emitEvent = function emitEvent(_ref) {
9
+ var type = _ref.type,
10
+ payload = _ref.payload;
9
11
  console.log('Emit event called', type);
12
+
13
+ if (type === 'translate') {
14
+ return payload;
15
+ }
10
16
  };
11
17
 
12
18
  var soundActions = [function (sound) {
@@ -63,6 +69,7 @@ var mockProps = {
63
69
  height: 1097
64
70
  },
65
71
  areas: [{
72
+ id: 'Uno',
66
73
  name: 'Uno',
67
74
  x: 0,
68
75
  y: 0,
@@ -127,6 +134,7 @@ var mockProps = {
127
134
  height: 1099
128
135
  },
129
136
  areas: [{
137
+ id: 'Dos',
130
138
  name: 'Uno',
131
139
  x: 0,
132
140
  y: 0,
@@ -136,6 +144,7 @@ var mockProps = {
136
144
  stroke: 'rgb(101,154,93)',
137
145
  closed: true
138
146
  }, {
147
+ id: 'Tres',
139
148
  name: 'Dos',
140
149
  x: 0,
141
150
  y: 0,
@@ -161,4 +170,255 @@ var mockProps = {
161
170
  hasHighlights: true
162
171
  }]
163
172
  };
164
- exports.mockProps = mockProps;
173
+ exports.mockProps = mockProps;
174
+ var mockProps2 = {
175
+ nodeId: 'xxas',
176
+ description: 'Dale al arma',
177
+ showFrames: true,
178
+ setInfo: function setInfo() {},
179
+ emitEvent: emitEvent,
180
+ soundActions: soundActions,
181
+ disableExit: function disableExit() {},
182
+ setResolveAction: function setResolveAction() {},
183
+ setShowPoints: function setShowPoints() {},
184
+ list: [{
185
+ info: {
186
+ hint: {
187
+ active: true,
188
+ desc: 'hint',
189
+ rewards: []
190
+ },
191
+ resolve: {
192
+ rewards: []
193
+ },
194
+ solution: {
195
+ right: {
196
+ desc: 'Estupendo',
197
+ desc_labelId: 'alfalfa01',
198
+ rewards: []
199
+ },
200
+ wrong: {
201
+ desc: 'BUUUU',
202
+ desc_labelId: 'fabada01',
203
+ rewards: [{
204
+ id: 'grade',
205
+ name: 'grade',
206
+ points: -17,
207
+ type: 'grade'
208
+ }]
209
+ }
210
+ },
211
+ instructions: 'instructions'
212
+ },
213
+ itemOrder: 1,
214
+ image: {
215
+ imgName: 'Paz-Vizla-Concept.png',
216
+ img: {
217
+ url: 'https://min.int.gamelearn.io/cooked.gl-lms-storage/clients/58dccfba26561500117caf53/image/609a9b30901f3e001247c031/Paz-Vizla-Concept.png',
218
+ imgName: 'Paz-Vizla-Concept.png',
219
+ resourceId: '609a9b30901f3e001247c031'
220
+ },
221
+ width: 1920,
222
+ height: 1097
223
+ },
224
+ areas: [{
225
+ id: 'Uno',
226
+ name: 'Uno',
227
+ x: 0,
228
+ y: 0,
229
+ fill: 'rgba(255, 255, 255, 0.1)',
230
+ draggable: true,
231
+ points: [1150.0742574257429, 217.48228650990103, 1570.95297029703, 65.42288056930694, 1704.0049504950498, 195.7595142326733, 1576.383663366337, 421.13327660891093, 1247.8267326732675, 510.73971225247533],
232
+ stroke: 'rgb(101,154,93)',
233
+ closed: true
234
+ }],
235
+ badAreas: [{
236
+ id: 'AllArea',
237
+ name: 'BadArea',
238
+ x: 0,
239
+ y: 0,
240
+ fill: 'rgba(255, 255, 255, 0.1)',
241
+ draggable: true,
242
+ points: [0, 0, 1920, 0, 1920, 1097, 0, 1097, 0, 0],
243
+ stroke: '#ff634d',
244
+ strokeWidth: 2,
245
+ closed: true
246
+ }],
247
+ hasClickOrder: false,
248
+ hasHighlights: true,
249
+ specificFeedbacks: {
250
+ correctFeedbacks: [{
251
+ id: 'Uno',
252
+ desc: 'specificFeedbacks 1 correcto',
253
+ rewards: [{
254
+ id: 'k2koxnkq',
255
+ name: 'Power',
256
+ points: 10,
257
+ type: 'score'
258
+ }]
259
+ }, {
260
+ id: 'Dos',
261
+ desc: 'specificFeedbacks 2 correcto',
262
+ rewards: [{
263
+ id: 'k2koxnkq',
264
+ name: 'Power',
265
+ points: 10,
266
+ type: 'score'
267
+ }]
268
+ }, {
269
+ id: 'Tres',
270
+ desc: 'specificFeedbacks 3 correcto',
271
+ rewards: [{
272
+ id: 'k2koxnkq',
273
+ name: 'Power',
274
+ points: 10,
275
+ type: 'score'
276
+ }]
277
+ }],
278
+ wrongFeedbacks: [{
279
+ id: 'Uno_bad',
280
+ desc: 'specificFeedbacks 1 incorrecto',
281
+ rewards: [{
282
+ id: 'k2koxnkq',
283
+ name: 'Power',
284
+ points: -10,
285
+ type: 'score'
286
+ }]
287
+ }, {
288
+ id: 'Dos_bad',
289
+ desc: 'specificFeedbacks 2 incorrecto',
290
+ rewards: [{
291
+ id: 'k2koxnkq',
292
+ name: 'Power',
293
+ points: -10,
294
+ type: 'score'
295
+ }]
296
+ }]
297
+ }
298
+ }, {
299
+ info: {
300
+ hint: {
301
+ active: true,
302
+ desc: 'hint',
303
+ rewards: []
304
+ },
305
+ resolve: {
306
+ rewards: []
307
+ },
308
+ solution: {
309
+ right: {
310
+ desc: 'Estupendo',
311
+ desc_labelId: 'alfalfa01',
312
+ rewards: []
313
+ },
314
+ wrong: {
315
+ desc: 'BUUUU',
316
+ desc_labelId: 'fabada01',
317
+ rewards: [{
318
+ id: 'grade',
319
+ name: 'grade',
320
+ points: -17,
321
+ type: 'grade'
322
+ }]
323
+ }
324
+ },
325
+ instructions: 'instructions'
326
+ },
327
+ itemOrder: 2,
328
+ image: {
329
+ imgName: 'pablo-carpio-slave2.jpeg',
330
+ img: {
331
+ url: 'https://min.int.gamelearn.io/cooked.gl-lms-storage/clients/58dccfba26561500117caf53/image/609e3d358782ea00116a7eee/pablo-carpio-slave2.jpeg',
332
+ imgName: 'Paz-Vizla-Concept.png',
333
+ resourceId: '609e3d358782ea00116a7eee'
334
+ },
335
+ width: 1920,
336
+ height: 1099
337
+ },
338
+ areas: [{
339
+ id: 'Dos',
340
+ name: 'Uno',
341
+ x: 0,
342
+ y: 0,
343
+ fill: 'rgba(68, 215, 171, 0.56)',
344
+ draggable: true,
345
+ points: [1305.4777227722775, 606.8812654702971, 1455.094059405941, 593.2797803217823, 1463.2549504950498, 941.4778001237626, 1346.282178217822, 1012.2055228960397, 1275.5544554455448, 906.1139387376239],
346
+ stroke: 'rgb(101,154,93)',
347
+ closed: true
348
+ }, {
349
+ id: 'Tres',
350
+ name: 'Dos',
351
+ x: 0,
352
+ y: 0,
353
+ fill: 'rgba(68, 215, 171, 0.56)',
354
+ draggable: true,
355
+ points: [171.1138613861387, 506.23027537128723, 312.5693069306932, 519.8317605198021, 304.4084158415843, 593.2797803217823, 157.51237623762387, 585.1188892326734],
356
+ stroke: 'rgb(101,154,93)',
357
+ closed: true
358
+ }],
359
+ badAreas: [{
360
+ id: 'AllArea',
361
+ name: 'BadArea',
362
+ x: 0,
363
+ y: 0,
364
+ fill: 'rgba(255, 255, 255, 0.1)',
365
+ draggable: true,
366
+ points: [0, 0, 1920, 0, 1920, 1099, 0, 1099, 0, 0],
367
+ stroke: '#ff634d',
368
+ strokeWidth: 2,
369
+ closed: true
370
+ }],
371
+ hasClickOrder: true,
372
+ hasHighlights: true,
373
+ specificFeedbacks: {
374
+ correctFeedbacks: [{
375
+ id: 'Uno',
376
+ desc: 'specificFeedbacks 1 correcto',
377
+ rewards: [{
378
+ id: 'k2koxnkq',
379
+ name: 'Power',
380
+ points: 10,
381
+ type: 'score'
382
+ }]
383
+ }, {
384
+ id: 'Dos',
385
+ desc: 'specificFeedbacks 2 correcto',
386
+ rewards: [{
387
+ id: 'k2koxnkq',
388
+ name: 'Power',
389
+ points: 10,
390
+ type: 'score'
391
+ }]
392
+ }, {
393
+ id: 'Tres',
394
+ desc: 'specificFeedbacks 3 correcto',
395
+ rewards: [{
396
+ id: 'k2koxnkq',
397
+ name: 'Power',
398
+ points: 10,
399
+ type: 'score'
400
+ }]
401
+ }],
402
+ wrongFeedbacks: [{
403
+ id: 'Uno_bad',
404
+ desc: 'specificFeedbacks 1 incorrecto',
405
+ rewards: [{
406
+ id: 'k2koxnkq',
407
+ name: 'Power',
408
+ points: -10,
409
+ type: 'score'
410
+ }]
411
+ }, {
412
+ id: 'Dos_bad',
413
+ desc: 'specificFeedbacks 2 incorrecto',
414
+ rewards: [{
415
+ id: 'k2koxnkq',
416
+ name: 'Power',
417
+ points: -10,
418
+ type: 'score'
419
+ }]
420
+ }]
421
+ }
422
+ }]
423
+ };
424
+ exports.mockProps2 = mockProps2;
@@ -19,9 +19,7 @@ var Message = function Message(_ref) {
19
19
  className: "conversation--message ".concat(voiceOver ? 'voice--over' : '')
20
20
  }, voiceOver ? /*#__PURE__*/_react.default.createElement("div", {
21
21
  className: "conversation--voice__over"
22
- }, /*#__PURE__*/_react.default.createElement("span", {
23
- className: "icon-voice-over"
24
- }), /*#__PURE__*/_react.default.createElement("span", null, current.name ? current.name : 'Voice-Over')) : /*#__PURE__*/_react.default.createElement("div", null), /*#__PURE__*/_react.default.createElement("span", {
22
+ }, /*#__PURE__*/_react.default.createElement("span", null, current.name ? current.name : 'Voice-Over')) : /*#__PURE__*/_react.default.createElement("div", null), /*#__PURE__*/_react.default.createElement("span", {
25
23
  className: "conversation--main__text"
26
24
  }, currentText));
27
25
  };
@@ -44,7 +44,6 @@ var CurrentFramePuzzle = function CurrentFramePuzzle(_ref) {
44
44
  framesCompleted = _ref.framesCompleted,
45
45
  handleFinish = _ref.handleFinish,
46
46
  setRewards = _ref.setRewards,
47
- accRewards = _ref.accRewards,
48
47
  setIndex = _ref.setIndex,
49
48
  setFramesCompleted = _ref.setFramesCompleted,
50
49
  loadPuzzleStatus = _ref.loadPuzzleStatus,
@@ -55,14 +54,18 @@ var CurrentFramePuzzle = function CurrentFramePuzzle(_ref) {
55
54
  translateFromParent = _ref.translateFromParent,
56
55
  setInfo = _ref.setInfo,
57
56
  emitEvent = _ref.emitEvent,
58
- nodeId = _ref.nodeId;
57
+ nodeId = _ref.nodeId,
58
+ setSelected = _ref.setSelected,
59
+ selected = _ref.selected;
59
60
 
60
61
  var _soundActions = _slicedToArray(soundActions, 1),
61
62
  playSound = _soundActions[0];
62
63
 
63
64
  var props = list[index];
64
- var info = props.info;
65
+ var info = props.info,
66
+ specificFeedbacks = props.specificFeedbacks;
65
67
  info.description = description;
68
+ var correctClicked = (0, _react.useRef)(0);
66
69
  var puzzleId = "frame-image-click-puzzle_".concat(index, "_").concat(nodeId);
67
70
  (0, _react.useEffect)(function () {
68
71
  puzzlesCompiledRef.current += 1;
@@ -72,18 +75,49 @@ var CurrentFramePuzzle = function CurrentFramePuzzle(_ref) {
72
75
  hintId: puzzleId
73
76
  }));
74
77
  }, [setInfo, info, puzzleId]);
78
+ (0, _react.useEffect)(function () {
79
+ correctClicked.current = 0;
80
+ }, [index]);
75
81
  var onComplete = (0, _react.useCallback)(function (rw) {
76
- var updatedCompleted = _objectSpread(_objectSpread({}, framesCompleted), {}, _defineProperty({}, index, true));
82
+ var correct = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
83
+
84
+ var updatedCompleted = _objectSpread({}, framesCompleted);
85
+
86
+ if (correct) {
87
+ var _specificFeedbacks$co;
88
+
89
+ if ((_specificFeedbacks$co = specificFeedbacks.correctFeedbacks) !== null && _specificFeedbacks$co !== void 0 && _specificFeedbacks$co.length && !props.hasClickOnce) {
90
+ correctClicked.current += 1;
91
+ setSelected(selected + 1);
92
+ } else {
93
+ correctClicked.current += props.areas.length;
94
+ setSelected(selected + props.areas.length);
95
+ }
96
+
97
+ if (correctClicked.current === props.areas.length) {
98
+ if (index + 1 >= list.length) {
99
+ handleFinish(rw);
100
+ }
101
+
102
+ updatedCompleted = _objectSpread(_objectSpread({}, updatedCompleted), {}, _defineProperty({}, index, true));
103
+ setFramesCompleted(updatedCompleted);
104
+ setIndex(index + 1 > list.length - 1 ? 0 : index + 1);
105
+ }
77
106
 
78
- if (Object.keys(updatedCompleted).length === list.length) {
79
- handleFinish(rw);
80
- } else {
81
107
  setRewards(rw);
82
- setIndex(index + 1 > list.length - 1 ? 0 : index + 1);
108
+ } else {
109
+ emitEvent({
110
+ type: 'addPoints',
111
+ payload: rw,
112
+ finish: false
113
+ });
114
+
115
+ if (props.hasClickOrder) {
116
+ setSelected(selected - correctClicked.current);
117
+ correctClicked.current = 0;
118
+ }
83
119
  }
84
-
85
- setFramesCompleted(updatedCompleted);
86
- }, [framesCompleted, handleFinish, index, list.length, setFramesCompleted, setIndex, setRewards]);
120
+ }, [emitEvent, specificFeedbacks, framesCompleted, props.hasClickOrder, props.hasClickOnce, props.areas.length, list.length, selected, setSelected, setRewards, index, setFramesCompleted, setIndex, handleFinish]);
87
121
  var handleResolve = (0, _react.useCallback)(function () {
88
122
  playSound('score');
89
123
  emitEvent({
@@ -114,6 +148,7 @@ var CurrentFramePuzzle = function CurrentFramePuzzle(_ref) {
114
148
  name: "",
115
149
  component: 'frame-click-puzzle'
116
150
  },
151
+ specificFeedbacks: specificFeedbacks,
117
152
  emitFinish: onComplete,
118
153
  emitResolve: handleResolve,
119
154
  hideContinue: true,
@@ -63,12 +63,21 @@ var FrameImageClickComponent = function FrameImageClickComponent(_ref) {
63
63
  framesCompleted = _useState4[0],
64
64
  setFramesCompleted = _useState4[1];
65
65
 
66
+ var _useState5 = (0, _react.useState)(0),
67
+ _useState6 = _slicedToArray(_useState5, 2),
68
+ selected = _useState6[0],
69
+ setSelected = _useState6[1];
70
+
66
71
  var puzzlesCompiledRef = (0, _react.useRef)(0);
67
72
  var hideTooltipRef = (0, _react.useRef)(false);
68
73
 
69
74
  var _soundActions = _slicedToArray(soundActions, 1),
70
75
  playSound = _soundActions[0];
71
76
 
77
+ var totalCorrects = list.reduce(function (acc, current) {
78
+ return acc + current.areas.length;
79
+ }, 0);
80
+
72
81
  var setRewards = function setRewards(rw) {
73
82
  accRewards.current = [].concat(_toConsumableArray(accRewards.current), _toConsumableArray(rw));
74
83
  };
@@ -121,6 +130,8 @@ var FrameImageClickComponent = function FrameImageClickComponent(_ref) {
121
130
  handleFinish: handleFinish,
122
131
  setRewards: setRewards,
123
132
  accRewards: accRewards,
133
+ setSelected: setSelected,
134
+ selected: selected,
124
135
  setIndex: setIndex,
125
136
  setFramesCompleted: setFramesCompleted,
126
137
  loadPuzzleStatus: loadPuzzleStatus,
@@ -161,8 +172,8 @@ var FrameImageClickComponent = function FrameImageClickComponent(_ref) {
161
172
  }))), showFrames ? /*#__PURE__*/_react.default.createElement("div", {
162
173
  className: "puzzle-frame__info"
163
174
  }, /*#__PURE__*/_react.default.createElement(_Counter.default, {
164
- current: Object.values(framesCompleted).length,
165
- total: list.length,
175
+ current: selected,
176
+ total: totalCorrects,
166
177
  tooltip: !hideTooltipRef.current,
167
178
  emitEvent: emitEvent
168
179
  })) : null));
@@ -3,15 +3,20 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.mockPropsOnce = exports.mockProps = void 0;
6
+ exports.mockProps2 = exports.mockPropsOnce = exports.mockProps = void 0;
7
+
8
+ var emitEvent = function emitEvent(_ref) {
9
+ var type = _ref.type,
10
+ payload = _ref.payload;
11
+
12
+ if (type === 'translate') {
13
+ return payload;
14
+ }
7
15
 
8
- var emitEvent = function emitEvent(type) {
9
16
  console.log('Emit event called', type);
10
17
  };
11
18
 
12
- var soundActions = [function (sound) {
13
- console.log('PlaySound called :', sound);
14
- }, function () {}];
19
+ var soundActions = [function () {}, function () {}];
15
20
  var mockProps = {
16
21
  nodeId: 'xxas',
17
22
  description: 'Dale al arma',
@@ -63,6 +68,7 @@ var mockProps = {
63
68
  height: 1097
64
69
  },
65
70
  areas: [{
71
+ id: 'Uno',
66
72
  name: 'Uno',
67
73
  x: 0,
68
74
  y: 0,
@@ -127,6 +133,7 @@ var mockProps = {
127
133
  height: 1099
128
134
  },
129
135
  areas: [{
136
+ id: 'Dos',
130
137
  name: 'Uno',
131
138
  x: 0,
132
139
  y: 0,
@@ -136,6 +143,7 @@ var mockProps = {
136
143
  stroke: 'rgb(101,154,93)',
137
144
  closed: true
138
145
  }, {
146
+ id: 'Tres',
139
147
  name: 'Dos',
140
148
  x: 0,
141
149
  y: 0,
@@ -313,4 +321,255 @@ var mockPropsOnce = {
313
321
  hasClickOnce: true
314
322
  }]
315
323
  };
316
- exports.mockPropsOnce = mockPropsOnce;
324
+ exports.mockPropsOnce = mockPropsOnce;
325
+ var mockProps2 = {
326
+ nodeId: 'xxas',
327
+ description: 'Dale al arma',
328
+ isFrame: true,
329
+ showFrames: true,
330
+ setInfo: function setInfo() {},
331
+ emitEvent: emitEvent,
332
+ soundActions: soundActions,
333
+ disableExit: function disableExit() {},
334
+ setResolveAction: function setResolveAction() {},
335
+ list: [{
336
+ info: {
337
+ hint: {
338
+ active: true,
339
+ desc: 'hint',
340
+ rewards: []
341
+ },
342
+ resolve: {
343
+ rewards: []
344
+ },
345
+ solution: {
346
+ right: {
347
+ desc: 'Estupendo',
348
+ desc_labelId: 'alfalfa01',
349
+ rewards: []
350
+ },
351
+ wrong: {
352
+ desc: 'BUUUU',
353
+ desc_labelId: 'fabada01',
354
+ rewards: [{
355
+ id: 'grade',
356
+ name: 'grade',
357
+ points: -17,
358
+ type: 'grade'
359
+ }]
360
+ }
361
+ },
362
+ instructions: 'instructions'
363
+ },
364
+ itemOrder: 1,
365
+ image: {
366
+ imgName: 'Paz-Vizla-Concept.png',
367
+ img: {
368
+ url: 'https://gl-lms-storage.s3-eu-west-1.amazonaws.com/development/clients/58dccfba26561500117caf53/image/609a9b30901f3e001247c031/Paz-Vizla-Concept.png',
369
+ imgName: 'Paz-Vizla-Concept.png',
370
+ resourceId: '609a9b30901f3e001247c031'
371
+ },
372
+ width: 1920,
373
+ height: 1097
374
+ },
375
+ areas: [{
376
+ id: 'Uno',
377
+ name: 'Uno',
378
+ x: 0,
379
+ y: 0,
380
+ fill: 'rgba(255, 255, 255, 0.1)',
381
+ draggable: true,
382
+ points: [1150.0742574257429, 217.48228650990103, 1570.95297029703, 65.42288056930694, 1704.0049504950498, 195.7595142326733, 1576.383663366337, 421.13327660891093, 1247.8267326732675, 510.73971225247533],
383
+ stroke: 'rgb(101,154,93)',
384
+ closed: true
385
+ }],
386
+ badAreas: [{
387
+ id: 'AllArea',
388
+ name: 'BadArea',
389
+ x: 0,
390
+ y: 0,
391
+ fill: 'rgba(255, 255, 255, 0.1)',
392
+ draggable: true,
393
+ points: [0, 0, 1920, 0, 1920, 1097, 0, 1097, 0, 0],
394
+ stroke: '#ff634d',
395
+ strokeWidth: 2,
396
+ closed: true
397
+ }],
398
+ hasClickOrder: false,
399
+ hasHighlights: true,
400
+ specificFeedbacks: {
401
+ correctFeedbacks: [{
402
+ id: 'Uno',
403
+ desc: 'specificFeedbacks 1 correcto',
404
+ rewards: [{
405
+ id: 'k2koxnkq',
406
+ name: 'Power',
407
+ points: 10,
408
+ type: 'score'
409
+ }]
410
+ }, {
411
+ id: 'Dos',
412
+ desc: 'specificFeedbacks 2 correcto',
413
+ rewards: [{
414
+ id: 'k2koxnkq',
415
+ name: 'Power',
416
+ points: 10,
417
+ type: 'score'
418
+ }]
419
+ }, {
420
+ id: 'Tres',
421
+ desc: 'specificFeedbacks 3 correcto',
422
+ rewards: [{
423
+ id: 'k2koxnkq',
424
+ name: 'Power',
425
+ points: 10,
426
+ type: 'score'
427
+ }]
428
+ }],
429
+ wrongFeedbacks: [{
430
+ id: 'Uno_bad',
431
+ desc: 'specificFeedbacks 1 incorrecto',
432
+ rewards: [{
433
+ id: 'k2koxnkq',
434
+ name: 'Power',
435
+ points: -10,
436
+ type: 'score'
437
+ }]
438
+ }, {
439
+ id: 'Dos_bad',
440
+ desc: 'specificFeedbacks 2 incorrecto',
441
+ rewards: [{
442
+ id: 'k2koxnkq',
443
+ name: 'Power',
444
+ points: -10,
445
+ type: 'score'
446
+ }]
447
+ }]
448
+ }
449
+ }, {
450
+ info: {
451
+ hint: {
452
+ active: true,
453
+ desc: 'hint',
454
+ rewards: []
455
+ },
456
+ resolve: {
457
+ rewards: []
458
+ },
459
+ solution: {
460
+ right: {
461
+ desc: 'Estupendo',
462
+ desc_labelId: 'alfalfa01',
463
+ rewards: []
464
+ },
465
+ wrong: {
466
+ desc: 'BUUUU',
467
+ desc_labelId: 'fabada01',
468
+ rewards: [{
469
+ id: 'grade',
470
+ name: 'grade',
471
+ points: -17,
472
+ type: 'grade'
473
+ }]
474
+ }
475
+ },
476
+ instructions: 'instructions'
477
+ },
478
+ itemOrder: 2,
479
+ image: {
480
+ imgName: 'pablo-carpio-slave2.jpeg',
481
+ img: {
482
+ url: 'https://gl-lms-storage.s3-eu-west-1.amazonaws.com/development/clients/58dccfba26561500117caf53/image/609e3d358782ea00116a7eee/pablo-carpio-slave2.jpeg',
483
+ imgName: 'Paz-Vizla-Concept.png',
484
+ resourceId: '609e3d358782ea00116a7eee'
485
+ },
486
+ width: 1920,
487
+ height: 1099
488
+ },
489
+ areas: [{
490
+ id: 'Dos',
491
+ name: 'Uno',
492
+ x: 0,
493
+ y: 0,
494
+ fill: 'rgba(68, 215, 171, 0.56)',
495
+ draggable: true,
496
+ points: [1305.4777227722775, 606.8812654702971, 1455.094059405941, 593.2797803217823, 1463.2549504950498, 941.4778001237626, 1346.282178217822, 1012.2055228960397, 1275.5544554455448, 906.1139387376239],
497
+ stroke: 'rgb(101,154,93)',
498
+ closed: true
499
+ }, {
500
+ id: 'Tres',
501
+ name: 'Dos',
502
+ x: 0,
503
+ y: 0,
504
+ fill: 'rgba(68, 215, 171, 0.56)',
505
+ draggable: true,
506
+ points: [171.1138613861387, 506.23027537128723, 312.5693069306932, 519.8317605198021, 304.4084158415843, 593.2797803217823, 157.51237623762387, 585.1188892326734],
507
+ stroke: 'rgb(101,154,93)',
508
+ closed: true
509
+ }],
510
+ badAreas: [{
511
+ id: 'AllArea',
512
+ name: 'BadArea',
513
+ x: 0,
514
+ y: 0,
515
+ fill: 'rgba(255, 255, 255, 0.1)',
516
+ draggable: true,
517
+ points: [0, 0, 1920, 0, 1920, 1099, 0, 1099, 0, 0],
518
+ stroke: '#ff634d',
519
+ strokeWidth: 2,
520
+ closed: true
521
+ }],
522
+ hasClickOrder: true,
523
+ hasHighlights: true,
524
+ specificFeedbacks: {
525
+ correctFeedbacks: [{
526
+ id: 'Uno',
527
+ desc: 'specificFeedbacks 1 correcto',
528
+ rewards: [{
529
+ id: 'k2koxnkq',
530
+ name: 'Power',
531
+ points: 10,
532
+ type: 'score'
533
+ }]
534
+ }, {
535
+ id: 'Dos',
536
+ desc: 'specificFeedbacks 2 correcto',
537
+ rewards: [{
538
+ id: 'k2koxnkq',
539
+ name: 'Power',
540
+ points: 10,
541
+ type: 'score'
542
+ }]
543
+ }, {
544
+ id: 'Tres',
545
+ desc: 'specificFeedbacks 3 correcto',
546
+ rewards: [{
547
+ id: 'k2koxnkq',
548
+ name: 'Power',
549
+ points: 10,
550
+ type: 'score'
551
+ }]
552
+ }],
553
+ wrongFeedbacks: [{
554
+ id: 'Uno_bad',
555
+ desc: 'specificFeedbacks 1 incorrecto',
556
+ rewards: [{
557
+ id: 'k2koxnkq',
558
+ name: 'Power',
559
+ points: -10,
560
+ type: 'score'
561
+ }]
562
+ }, {
563
+ id: 'Dos_bad',
564
+ desc: 'specificFeedbacks 2 incorrecto',
565
+ rewards: [{
566
+ id: 'k2koxnkq',
567
+ name: 'Power',
568
+ points: -10,
569
+ type: 'score'
570
+ }]
571
+ }]
572
+ }
573
+ }]
574
+ };
575
+ exports.mockProps2 = mockProps2;
@@ -8,7 +8,7 @@ exports.mockProps4 = exports.mockProps3 = exports.mockProps2 = exports.mockProps
8
8
  var emitEvent = function emitEvent(_ref) {
9
9
  var type = _ref.type,
10
10
  payload = _ref.payload;
11
- console.log('Emit event called');
11
+ console.log('Emit event called', type);
12
12
 
13
13
  if (type === 'translate') {
14
14
  return payload;
@@ -57,32 +57,7 @@ var ImageReview = function ImageReview() {
57
57
  };
58
58
 
59
59
  var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
60
- var _useState = (0, _react.useState)([]),
61
- _useState2 = _slicedToArray(_useState, 2),
62
- clickedZones = _useState2[0],
63
- setClickedZones = _useState2[1];
64
-
65
- var _useState3 = (0, _react.useState)(false),
66
- _useState4 = _slicedToArray(_useState3, 2),
67
- completed = _useState4[0],
68
- setCompleted = _useState4[1];
69
-
70
- var _useState5 = (0, _react.useState)(false),
71
- _useState6 = _slicedToArray(_useState5, 2),
72
- finished = _useState6[0],
73
- setFinished = _useState6[1];
74
-
75
- var _useState7 = (0, _react.useState)(false),
76
- _useState8 = _slicedToArray(_useState7, 2),
77
- showWrongFeedback = _useState8[0],
78
- setShowWrongFeedback = _useState8[1];
79
-
80
- var _useState9 = (0, _react.useState)(false),
81
- _useState10 = _slicedToArray(_useState9, 2),
82
- disableClick = _useState10[0],
83
- setDisableClick = _useState10[1]; // Common config
84
-
85
-
60
+ // Common config
86
61
  var soundActions = props.soundActions,
87
62
  emitEvent = props.emitEvent,
88
63
  disableExit = props.disableExit,
@@ -99,7 +74,33 @@ var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
99
74
  className = props.className,
100
75
  emitFinish = props.emitFinish,
101
76
  emitResolve = props.emitResolve,
102
- translateFromParent = props.translateFromParent;
77
+ translateFromParent = props.translateFromParent,
78
+ specificFeedbacks = props.specificFeedbacks;
79
+
80
+ var _useState = (0, _react.useState)([]),
81
+ _useState2 = _slicedToArray(_useState, 2),
82
+ clickedZones = _useState2[0],
83
+ setClickedZones = _useState2[1];
84
+
85
+ var _useState3 = (0, _react.useState)(false),
86
+ _useState4 = _slicedToArray(_useState3, 2),
87
+ completed = _useState4[0],
88
+ setCompleted = _useState4[1];
89
+
90
+ var _useState5 = (0, _react.useState)(false),
91
+ _useState6 = _slicedToArray(_useState5, 2),
92
+ finished = _useState6[0],
93
+ setFinished = _useState6[1];
94
+
95
+ var _useState7 = (0, _react.useState)({
96
+ show: false,
97
+ success: false,
98
+ text: '',
99
+ rewards: []
100
+ }),
101
+ _useState8 = _slicedToArray(_useState7, 2),
102
+ feedbackData = _useState8[0],
103
+ setFeedbackData = _useState8[1];
103
104
 
104
105
  var translate = function translate(id) {
105
106
  if (translateFromParent) return translateFromParent(id); // when there is no emitEvent pass the Translate
@@ -110,11 +111,6 @@ var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
110
111
  });
111
112
  };
112
113
 
113
- var _useState11 = (0, _react.useState)(''),
114
- _useState12 = _slicedToArray(_useState11, 2),
115
- resolvedClass = _useState12[0],
116
- setResolveClass = _useState12[1];
117
-
118
114
  var _soundActions = _slicedToArray(soundActions, 1),
119
115
  playSound = _soundActions[0];
120
116
 
@@ -132,18 +128,16 @@ var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
132
128
  shape: 'poly'
133
129
  }, area);
134
130
  });
135
- var handleFinish = (0, _react.useCallback)(function () {
136
- var rewards = solution.right.rewards;
137
-
131
+ var handleFinish = (0, _react.useCallback)(function (rewards, success) {
138
132
  if (emitFinish) {
139
- emitFinish(rewards);
133
+ emitFinish(rewards, success);
140
134
  } else {
141
135
  emitEvent({
142
136
  type: 'addPoints',
143
137
  payload: rewards
144
138
  });
145
139
  }
146
- }, [emitEvent, emitFinish, solution.right]);
140
+ }, [emitEvent, emitFinish]);
147
141
  (0, _react.useEffect)(function () {
148
142
  if (completed) {
149
143
  disableExit(true);
@@ -153,16 +147,32 @@ var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
153
147
  setCompleted(defaultCompleted);
154
148
  }, [defaultCompleted]);
155
149
  (0, _react.useEffect)(function () {
156
- if (areas.length === clickedZones.length && !completed || hasClickOnce && clickedZones.length > 0) {
150
+ if ((areas.length === clickedZones.length || hasClickOnce && clickedZones.length > 0) && !completed) {
151
+ var _specificFeedbacks$co;
152
+
157
153
  setCompleted(true);
158
- setDisableClick(true);
159
- setResolveClass('success');
154
+ var lastClicked = clickedZones[clickedZones.length - 1];
155
+ var lastSpecific = specificFeedbacks.correctFeedbacks.find(function (feed) {
156
+ return feed.id === lastClicked.id;
157
+ });
158
+
159
+ if (!((_specificFeedbacks$co = specificFeedbacks.correctFeedbacks) !== null && _specificFeedbacks$co !== void 0 && _specificFeedbacks$co.length) || specificFeedbacks.correctFeedbacks.some(function (feed) {
160
+ return !feed.desc;
161
+ }) || hasClickOnce) {
162
+ setFeedbackData(function (oldState) {
163
+ return _objectSpread(_objectSpread({}, oldState), {}, {
164
+ show: true,
165
+ success: true,
166
+ text: lastSpecific ? lastSpecific.desc : info.solution.right.desc,
167
+ rewards: lastSpecific ? lastSpecific.rewards : info.solution.right.rewards
168
+ });
169
+ });
170
+ }
160
171
  }
161
- }, [clickedZones, areas.length, completed, info.solution.right.desc, emitEvent, hasClickOnce]);
172
+ }, [clickedZones, areas.length, specificFeedbacks, hasClickOnce, completed, info.solution.right]);
162
173
  (0, _react.useEffect)(function () {
163
174
  setResolveAction(function (resolve) {
164
175
  setCompleted(true);
165
- setDisableClick(true);
166
176
  setFinished(true);
167
177
  setTimeout(function () {
168
178
  emitResolve ? emitResolve(resolve) : resolve();
@@ -175,78 +185,117 @@ var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
175
185
  }
176
186
  }, [finished, disableExit]);
177
187
 
178
- var handleClickOutSide = function handleClickOutSide() {
179
- if (!disableClick && !defaultCompleted) {
180
- var wrongRewards = solution.wrong.rewards;
181
- emitEvent({
182
- type: 'hidePuzzleButtons',
183
- payload: true
188
+ var handleIncorrectAreaClick = function handleIncorrectAreaClick(area) {
189
+ if (!completed) {
190
+ var _specificFeedbacks$wr;
191
+
192
+ var _solution$wrong = solution.wrong,
193
+ wrongRewards = _solution$wrong.rewards,
194
+ desc = _solution$wrong.desc;
195
+ var feedback = desc;
196
+ var rewards = wrongRewards;
197
+ var specific = (_specificFeedbacks$wr = specificFeedbacks.wrongFeedbacks) === null || _specificFeedbacks$wr === void 0 ? void 0 : _specificFeedbacks$wr.find(function (feed) {
198
+ return feed.id === area.id;
184
199
  });
185
200
 
201
+ if (specific) {
202
+ feedback = specific.desc;
203
+ rewards = specific.rewards;
204
+ }
205
+
206
+ if (emitFinish) {
207
+ emitFinish(wrongRewards, false);
208
+ }
209
+
186
210
  if (hasClickOrder) {
211
+ var _info$orderFeedback;
212
+
187
213
  setClickedZones([]);
214
+
215
+ if (info !== null && info !== void 0 && (_info$orderFeedback = info.orderFeedback) !== null && _info$orderFeedback !== void 0 && _info$orderFeedback.desc) {
216
+ feedback = info.orderFeedback.desc;
217
+ rewards = info.orderFeedback.rewards;
218
+ }
188
219
  }
189
220
 
190
- setShowWrongFeedback(true);
191
- setResolveClass('wrong');
192
- playSound('fail');
193
- setTimeout(function () {
194
- setShowWrongFeedback(false);
195
- setResolveClass('');
196
- emitEvent({
197
- type: 'addPoints',
198
- payload: wrongRewards,
199
- finish: false
221
+ setFeedbackData(function (oldState) {
222
+ return _objectSpread(_objectSpread({}, oldState), {}, {
223
+ show: true,
224
+ success: false,
225
+ text: feedback,
226
+ rewards: rewards
200
227
  });
201
- }, 2000);
228
+ });
229
+ playSound('fail');
202
230
  }
203
231
  };
204
232
 
205
- var handleOnClose = function handleOnClose() {
206
- handleFinish();
233
+ var handleOnClose = (0, _react.useCallback)(function () {
234
+ handleFinish(feedbackData.rewards, feedbackData.success);
207
235
  playSound('click-ui');
208
- setResolveClass('');
209
- setShowWrongFeedback(false);
210
- };
236
+ setFeedbackData(function (oldState) {
237
+ return _objectSpread(_objectSpread({}, oldState), {}, {
238
+ show: false,
239
+ success: false,
240
+ text: '',
241
+ rewards: []
242
+ });
243
+ });
244
+ }, [feedbackData.rewards, feedbackData.success, handleFinish, playSound]);
211
245
 
212
- var handleAreaClick = function handleAreaClick(area) {
246
+ var handleCorrectAreaClick = function handleCorrectAreaClick(area) {
213
247
  if (!clickedZones.some(function (zone) {
214
248
  return zone.index === area.index;
215
- }) && !defaultCompleted && !showWrongFeedback && !disableClick) {
216
- var updatedClickedZones = [].concat(_toConsumableArray(clickedZones), [area]);
249
+ }) && !feedbackData.show && !completed) {
217
250
  playSound('click-ui');
251
+ var feedback = solution.right.desc;
252
+ var rewards = solution.right.rewards;
253
+ var updatedZones = [].concat(_toConsumableArray(clickedZones), [area]);
218
254
 
219
255
  if (hasClickOrder && area.index === clickedZones.length || !hasClickOrder) {
220
- setClickedZones(updatedClickedZones);
221
- } else {
222
- var _solution$wrong = solution.wrong,
223
- wrongRewards = _solution$wrong.rewards,
224
- feedback = _solution$wrong.desc;
225
- setClickedZones([]);
226
- updatedClickedZones = [];
227
-
228
- if (feedback) {
229
- setShowWrongFeedback(true);
230
- setResolveClass('wrong');
231
- } else {
232
- emitEvent({
233
- type: 'addPoints',
234
- payload: wrongRewards,
235
- finish: false
256
+ var _specificFeedbacks$co2;
257
+
258
+ if ((_specificFeedbacks$co2 = specificFeedbacks.correctFeedbacks) !== null && _specificFeedbacks$co2 !== void 0 && _specificFeedbacks$co2.length) {
259
+ var _specificFeedbacks$co3;
260
+
261
+ var specific = (_specificFeedbacks$co3 = specificFeedbacks.correctFeedbacks) === null || _specificFeedbacks$co3 === void 0 ? void 0 : _specificFeedbacks$co3.find(function (feed) {
262
+ return feed.id === area.id;
236
263
  });
264
+
265
+ if (specific) {
266
+ feedback = specific.desc;
267
+ rewards = specific.rewards;
268
+ }
269
+
270
+ if (!feedback && areas.length > updatedZones.length && !hasClickOnce) {
271
+ handleFinish(rewards, true);
272
+ } else if (feedback && !hasClickOnce) {
273
+ setFeedbackData(function (oldState) {
274
+ return _objectSpread(_objectSpread({}, oldState), {}, {
275
+ show: true,
276
+ success: true,
277
+ text: feedback,
278
+ rewards: rewards
279
+ });
280
+ });
281
+ }
237
282
  }
283
+
284
+ setClickedZones(updatedZones);
285
+ } else {
286
+ handleIncorrectAreaClick(area);
238
287
  }
239
288
  }
240
289
  };
241
290
 
242
291
  return /*#__PURE__*/_react.default.createElement("div", {
243
292
  className: className
244
- }, resolvedClass ? /*#__PURE__*/_react.default.createElement(_FeedbackComponent.default, {
293
+ }, feedbackData.show ? /*#__PURE__*/_react.default.createElement(_FeedbackComponent.default, {
245
294
  playSound: playSound,
246
- text: info.solution[resolvedClass === 'success' ? 'right' : 'wrong'].desc,
247
- success: resolvedClass === 'success',
295
+ text: feedbackData.text,
296
+ success: feedbackData.success,
248
297
  translate: translate,
249
- hasTimeout: !info.solution.right.desc,
298
+ hasTimeout: !feedbackData.text,
250
299
  delay: 2000,
251
300
  functionOnClose: handleOnClose
252
301
  }) : null, /*#__PURE__*/_react.default.createElement(_KonvaMapper.default, {
@@ -255,8 +304,8 @@ var ImageClickWrapperComponent = function ImageClickWrapperComponent(props) {
255
304
  areas: areasList,
256
305
  badAreas: badAreasList,
257
306
  clickedZones: clickedZones,
258
- onClick: handleAreaClick,
259
- onClickOutside: handleClickOutSide,
307
+ onClick: handleCorrectAreaClick,
308
+ onClickOutside: handleIncorrectAreaClick,
260
309
  hasHighlights: hasHighlights,
261
310
  emitEvent: emitEvent
262
311
  }), hasImageReview ? /*#__PURE__*/_react.default.createElement(ImageReview, null) : null);
@@ -68,7 +68,7 @@ var Area = function Area(_ref) {
68
68
  var clickArea = function clickArea() {
69
69
  if (!completed) {
70
70
  if (isBad) {
71
- onClickOutside();
71
+ onClickOutside(area);
72
72
  } else {
73
73
  onClick(area);
74
74
  }
@@ -96,7 +96,7 @@ var KonvaMapper = function KonvaMapper(_ref) {
96
96
 
97
97
  var handleStageClick = function handleStageClick(a) {
98
98
  if (incorrectArea && !a.target.attrs.shape) {
99
- onClickOutside();
99
+ onClickOutside(incorrectArea);
100
100
  }
101
101
  };
102
102
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gamelearn/arcade-components",
3
3
  "license": "Gamelearn",
4
- "version": "0.22.8",
4
+ "version": "0.22.10",
5
5
  "main": "dist/index.js",
6
6
  "files": [
7
7
  "dist",