@gamelearn/arcade-components 1.17.2 → 1.18.1

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.
@@ -51,29 +51,37 @@ var ComicComponent = function ComicComponent(_ref) {
51
51
  automatic = _useState2[0],
52
52
  setAutomatic = _useState2[1];
53
53
 
54
+ var _useState3 = (0, _react.useState)(false),
55
+ _useState4 = _slicedToArray(_useState3, 2),
56
+ audioFailed = _useState4[0],
57
+ setAudioFailed = _useState4[1];
58
+
54
59
  var _useTimeout = (0, _useTimeout2.default)(),
55
60
  start = _useTimeout.start,
56
61
  stop = _useTimeout.stop;
57
62
 
58
- var _useState3 = (0, _react.useState)(0),
59
- _useState4 = _slicedToArray(_useState3, 2),
60
- slideCount = _useState4[0],
61
- setCount = _useState4[1];
62
-
63
- var _useState5 = (0, _react.useState)('slide-animation'),
63
+ var _useState5 = (0, _react.useState)(0),
64
64
  _useState6 = _slicedToArray(_useState5, 2),
65
- slideTransition = _useState6[0],
66
- setTransition = _useState6[1];
65
+ slideCount = _useState6[0],
66
+ setCount = _useState6[1];
67
+
68
+ var _useState7 = (0, _react.useState)('slide-animation'),
69
+ _useState8 = _slicedToArray(_useState7, 2),
70
+ slideTransition = _useState8[0],
71
+ setTransition = _useState8[1];
67
72
 
68
73
  var _soundActions = _slicedToArray(soundActions, 1),
69
74
  play = _soundActions[0];
70
75
 
76
+ var slide = slides === null || slides === void 0 ? void 0 : slides[slideCount];
71
77
  var close = (0, _react.useCallback)(function () {
72
78
  emitEvent({
73
79
  type: 'success'
74
80
  });
75
81
  }, [emitEvent]);
76
82
  var goToNextSlide = (0, _react.useCallback)(function () {
83
+ setAudioFailed(false);
84
+
77
85
  if (slideCount + 1 < slides.length) {
78
86
  setTransition('slide-animation');
79
87
  setCount(slideCount + 1);
@@ -82,6 +90,8 @@ var ComicComponent = function ComicComponent(_ref) {
82
90
  }
83
91
  }, [close, slideCount, slides === null || slides === void 0 ? void 0 : slides.length]);
84
92
  var goToPreviousSlide = (0, _react.useCallback)(function () {
93
+ setAudioFailed(false);
94
+
85
95
  if (slideCount - 1 >= 0) {
86
96
  setTransition('slide-animation');
87
97
  setCount(slideCount - 1);
@@ -101,27 +111,27 @@ var ComicComponent = function ComicComponent(_ref) {
101
111
  goToPreviousSlide();
102
112
  };
103
113
 
104
- (0, _useEkho.default)({
114
+ var stopEkho = (0, _useEkho.default)({
105
115
  audioType: slides === null || slides === void 0 ? void 0 : (_slides$slideCount = slides[slideCount]) === null || _slides$slideCount === void 0 ? void 0 : _slides$slideCount.audioType,
106
116
  voice: slides === null || slides === void 0 ? void 0 : (_slides$slideCount2 = slides[slideCount]) === null || _slides$slideCount2 === void 0 ? void 0 : _slides$slideCount2.voice,
107
117
  text: slides === null || slides === void 0 ? void 0 : (_slides$slideCount3 = slides[slideCount]) === null || _slides$slideCount3 === void 0 ? void 0 : (_slides$slideCount3$v = _slides$slideCount3.vignettes[0].textData) === null || _slides$slideCount3$v === void 0 ? void 0 : _slides$slideCount3$v.text,
108
118
  audio: slides === null || slides === void 0 ? void 0 : (_slides$slideCount4 = slides[slideCount]) === null || _slides$slideCount4 === void 0 ? void 0 : _slides$slideCount4.audio,
109
119
  soundActions: soundActions,
110
120
  emitEvent: emitEvent,
121
+ onError: function onError() {
122
+ setAudioFailed(true);
123
+ },
111
124
  onFinish: function onFinish() {
112
- var _slides$slideCount5;
113
-
114
- if (automatic && (slides === null || slides === void 0 ? void 0 : (_slides$slideCount5 = slides[slideCount]) === null || _slides$slideCount5 === void 0 ? void 0 : _slides$slideCount5.audioType) !== 'none') {
125
+ if (automatic) {
115
126
  goToNextSlide();
116
127
  }
117
128
  }
118
129
  });
119
130
  (0, _react.useEffect)(function () {
120
- var slide = slides === null || slides === void 0 ? void 0 : slides[slideCount];
121
- var audio = (slide === null || slide === void 0 ? void 0 : slide.audioType) === 'file' && Object.keys(slide.audio || {}).length;
122
- var voice = (slide === null || slide === void 0 ? void 0 : slide.audioType) === 'voice' && Object.keys(slide.voice || {}).length;
123
-
124
- if (automatic && ((slide === null || slide === void 0 ? void 0 : slide.audioType) === 'none' || !audio || !voice)) {
131
+ stopEkho();
132
+ }, [slideCount, stopEkho]);
133
+ (0, _react.useEffect)(function () {
134
+ if (automatic && ((slide === null || slide === void 0 ? void 0 : slide.audioType) === 'none' || audioFailed)) {
125
135
  var _slide$vignettes$, _slide$vignettes$$tex;
126
136
 
127
137
  var time = characterMs * ((slide === null || slide === void 0 ? void 0 : (_slide$vignettes$ = slide.vignettes[0]) === null || _slide$vignettes$ === void 0 ? void 0 : (_slide$vignettes$$tex = _slide$vignettes$.textData) === null || _slide$vignettes$$tex === void 0 ? void 0 : _slide$vignettes$$tex.text.length) || 0);
@@ -131,7 +141,7 @@ var ComicComponent = function ComicComponent(_ref) {
131
141
  return function () {
132
142
  stop();
133
143
  };
134
- }, [automatic, goToNextSlide, slideCount, slides, start, stop]);
144
+ }, [audioFailed, automatic, goToNextSlide, slide === null || slide === void 0 ? void 0 : slide.audioType, slide === null || slide === void 0 ? void 0 : slide.vignettes, start, stop]);
135
145
  if (!(slides !== null && slides !== void 0 && slides.length)) return null;
136
146
  return /*#__PURE__*/_react.default.createElement("div", {
137
147
  dir: (0, _LangIsRtl.default)() ? 'rtl' : 'auto',
@@ -66,10 +66,15 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
66
66
  automatic = _useState2[0],
67
67
  setAutomatic = _useState2[1];
68
68
 
69
- var _useState3 = (0, _react.useState)(0),
69
+ var _useState3 = (0, _react.useState)(false),
70
70
  _useState4 = _slicedToArray(_useState3, 2),
71
- currentLine = _useState4[0],
72
- setCurrentLine = _useState4[1];
71
+ audioFailed = _useState4[0],
72
+ setAudioFailed = _useState4[1];
73
+
74
+ var _useState5 = (0, _react.useState)(0),
75
+ _useState6 = _slicedToArray(_useState5, 2),
76
+ currentLine = _useState6[0],
77
+ setCurrentLine = _useState6[1];
73
78
 
74
79
  var _soundActions = _slicedToArray(soundActions, 1),
75
80
  playSound = _soundActions[0];
@@ -241,6 +246,8 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
241
246
  }
242
247
  }, [currentLineData.id, edges, finishConversation, lines]);
243
248
  var handleClickNext = (0, _react.useCallback)(function (choice, reset) {
249
+ setAudioFailed(false);
250
+
244
251
  if (isBranched) {
245
252
  if (choice) {
246
253
  handleDecisionBranch(choice, reset);
@@ -260,6 +267,8 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
260
267
  }, [currentLine, finishConversation, handleBranchDirection, handleDecisionBranch, isBranched, lines.length]);
261
268
 
262
269
  var handleClickBack = function handleClickBack() {
270
+ setAudioFailed(false);
271
+
263
272
  if (isBranched) {
264
273
  handleBranchDirection(false);
265
274
  } else if (currentLine > 0) {
@@ -280,24 +289,28 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
280
289
  };
281
290
 
282
291
  var autoplayCond = automatic && !isDecision;
283
- var audio = (currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'file' && Object.keys(currentLine.audio || {}).length;
284
- var voice = (currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'voice' && Object.keys(currentLine.voice || {}).length;
285
- (0, _useEkho.default)({
292
+ var stopEkho = (0, _useEkho.default)({
286
293
  audioType: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType,
287
294
  voice: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.voice,
288
295
  text: currentMessage === null || currentMessage === void 0 ? void 0 : currentMessage.text,
289
296
  audio: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audio,
290
297
  soundActions: soundActions,
291
298
  emitEvent: emitEvent,
299
+ onError: function onError() {
300
+ setAudioFailed(true);
301
+ },
292
302
  onFinish: function onFinish() {
293
303
  if (autoplayCond && (currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) !== 'none') {
294
304
  handleClickNext();
295
305
  }
296
306
  }
297
- }); // Autoplay logic
307
+ });
308
+ (0, _react.useEffect)(function () {
309
+ stopEkho();
310
+ }, [currentLine, stopEkho]); // Autoplay logic
298
311
 
299
312
  (0, _react.useEffect)(function () {
300
- if (autoplayCond && ((currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'none' || !audio || !voice)) {
313
+ if (autoplayCond && ((currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'none' || audioFailed)) {
301
314
  var _currentMessage$text;
302
315
 
303
316
  var time = characterMs * ((currentMessage === null || currentMessage === void 0 ? void 0 : (_currentMessage$text = currentMessage.text) === null || _currentMessage$text === void 0 ? void 0 : _currentMessage$text.length) || 0);
@@ -307,7 +320,7 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
307
320
  return function () {
308
321
  stop();
309
322
  };
310
- }, [currentMessage, start, stop, handleClickNext, currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType, autoplayCond, audio, voice]);
323
+ }, [currentMessage, start, stop, handleClickNext, currentLineData.audioType, autoplayCond, audioFailed]);
311
324
 
312
325
  var decisionPayload = _objectSpread(_objectSpread({}, currentLineData.payload), {}, {
313
326
  required: !isBranched,
@@ -100,6 +100,11 @@ var DialogComponent = function DialogComponent(_ref) {
100
100
  currentMessage = _useState6[0],
101
101
  setCurrentMessage = _useState6[1];
102
102
 
103
+ var _useState7 = (0, _react.useState)(false),
104
+ _useState8 = _slicedToArray(_useState7, 2),
105
+ audioFailed = _useState8[0],
106
+ setAudioFailed = _useState8[1];
107
+
103
108
  var _useThree = (0, _fiber.useThree)(function (state) {
104
109
  return [state.camera, state.scene];
105
110
  }),
@@ -219,7 +224,9 @@ var DialogComponent = function DialogComponent(_ref) {
219
224
  var finishConversation = (0, _react.useCallback)(function () {
220
225
  resetAnims();
221
226
  lastSet.current = true;
222
- setCurrentMessage({});
227
+ setCurrentMessage({
228
+ show: false
229
+ });
223
230
  resetCameraView();
224
231
  setTimeout(function () {
225
232
  changeLine(0);
@@ -244,7 +251,9 @@ var DialogComponent = function DialogComponent(_ref) {
244
251
  });
245
252
 
246
253
  if (destination >= 0) {
247
- setCurrentMessage({});
254
+ setCurrentMessage({
255
+ show: false
256
+ });
248
257
  changeLine(destination);
249
258
  } else {
250
259
  finishConversation();
@@ -252,10 +261,14 @@ var DialogComponent = function DialogComponent(_ref) {
252
261
  }
253
262
  }, [currentLine.id, edges, finishConversation, lines]);
254
263
  var backLine = (0, _react.useCallback)(function () {
264
+ setAudioFailed(false);
265
+
255
266
  if (isBranched) {
256
267
  handleBranchDirection(false);
257
268
  } else if (lastLine && !(lastLine !== null && lastLine !== void 0 && lastLine.decision) || lastLine.type && !lastLine.type !== 'conversationalDecision') {
258
- setCurrentMessage({});
269
+ setCurrentMessage({
270
+ show: false
271
+ });
259
272
  changeLine(line - 1);
260
273
  }
261
274
  }, [handleBranchDirection, isBranched, lastLine, line]);
@@ -275,7 +288,9 @@ var DialogComponent = function DialogComponent(_ref) {
275
288
  if ((currentEdge === null || currentEdge === void 0 ? void 0 : currentEdge.fromId) === (currentEdge === null || currentEdge === void 0 ? void 0 : currentEdge.toId)) {
276
289
  reset();
277
290
  } else {
278
- setCurrentMessage({});
291
+ setCurrentMessage({
292
+ show: false
293
+ });
279
294
  changeLine(destinationEdge);
280
295
  }
281
296
  } else {
@@ -283,6 +298,8 @@ var DialogComponent = function DialogComponent(_ref) {
283
298
  }
284
299
  }, [currentLine.id, edges, finishConversation, lines]);
285
300
  var nextLine = (0, _react.useCallback)(function (choice, reset) {
301
+ setAudioFailed(false);
302
+
286
303
  if (isBranched) {
287
304
  if (choice) {
288
305
  handleDecisionBranch(choice, reset);
@@ -290,7 +307,9 @@ var DialogComponent = function DialogComponent(_ref) {
290
307
  handleBranchDirection();
291
308
  }
292
309
  } else if (line < lines.length - 1) {
293
- setCurrentMessage({});
310
+ setCurrentMessage({
311
+ show: false
312
+ });
294
313
  changeLine(line + 1);
295
314
  } else {
296
315
  finishConversation();
@@ -442,25 +461,32 @@ var DialogComponent = function DialogComponent(_ref) {
442
461
  }
443
462
  }, [actors, camera, currentLine, zoomInActor, getCurrentVisible, translate, getAvatarURL, loadEmotion, resetCameraView, isDecision, isVoiceOver]);
444
463
  var autoPlayCond = automatic && !currentLine.decision;
445
- var audio = (currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'file' && Object.keys(currentLine.audio || {}).length;
446
- var voice = (currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'voice' && Object.keys(currentLine.voice || {}).length; // Sound logic
464
+ var audio = Object.keys(currentLine.audio || {}).length;
465
+ var voice = Object.keys(currentLine.voice || {}).length; // Sound logic
447
466
 
448
- (0, _useEkho.default)({
467
+ var stopEkho = (0, _useEkho.default)({
449
468
  audioType: currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType,
450
469
  voice: currentLine === null || currentLine === void 0 ? void 0 : currentLine.voice,
470
+ started: currentMessage.show,
451
471
  text: currentMessage === null || currentMessage === void 0 ? void 0 : currentMessage.text,
452
472
  audio: currentLine === null || currentLine === void 0 ? void 0 : currentLine.audio,
453
473
  soundActions: soundActions,
454
474
  emitEvent: emitEvent,
475
+ onError: function onError() {
476
+ setAudioFailed(true);
477
+ },
455
478
  onFinish: function onFinish() {
456
479
  if (autoPlayCond) {
457
480
  nextLine();
458
481
  }
459
482
  }
460
- }); // Autoplay logic
483
+ });
484
+ (0, _react.useEffect)(function () {
485
+ stopEkho();
486
+ }, [line, stopEkho]); // Autoplay logic
461
487
 
462
488
  (0, _react.useEffect)(function () {
463
- if (autoPlayCond && currentMessage.show && ((currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'none' || !audio || !voice)) {
489
+ if (autoPlayCond && currentMessage.show && ((currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'none' || audioFailed)) {
464
490
  var _currentMessage$text;
465
491
 
466
492
  var time = characterMs * ((currentMessage === null || currentMessage === void 0 ? void 0 : (_currentMessage$text = currentMessage.text) === null || _currentMessage$text === void 0 ? void 0 : _currentMessage$text.length) || 0);
@@ -470,7 +496,7 @@ var DialogComponent = function DialogComponent(_ref) {
470
496
  return function () {
471
497
  stop();
472
498
  };
473
- }, [currentMessage, nextLine, start, stop, currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType, autoPlayCond, audio, voice]); // Positioning logic
499
+ }, [currentMessage, nextLine, start, stop, currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType, autoPlayCond, audio, voice, audioFailed]); // Positioning logic
474
500
 
475
501
  var checkBubblePosition = (0, _react.useCallback)(function () {
476
502
  if (bubbleRef.current && currentLine.slots) {
@@ -33,11 +33,15 @@ var useEkho = function useEkho(_ref) {
33
33
  audioType = _ref.audioType,
34
34
  _ref$loop = _ref.loop,
35
35
  loop = _ref$loop === void 0 ? false : _ref$loop,
36
+ _ref$started = _ref.started,
37
+ started = _ref$started === void 0 ? true : _ref$started,
36
38
  audio = _ref.audio,
37
39
  soundActions = _ref.soundActions,
38
40
  emitEvent = _ref.emitEvent,
39
41
  _ref$onFinish = _ref.onFinish,
40
42
  onFinish = _ref$onFinish === void 0 ? noop : _ref$onFinish,
43
+ _ref$onError = _ref.onError,
44
+ onError = _ref$onError === void 0 ? noop : _ref$onError,
41
45
  _ref$onStart = _ref.onStart,
42
46
  onStart = _ref$onStart === void 0 ? noop : _ref$onStart;
43
47
 
@@ -114,7 +118,7 @@ var useEkho = function useEkho(_ref) {
114
118
  switch (_context.prev = _context.next) {
115
119
  case 0:
116
120
  if (!(payload.voiceId && payload.text)) {
117
- _context.next = 5;
121
+ _context.next = 7;
118
122
  break;
119
123
  }
120
124
 
@@ -126,9 +130,20 @@ var useEkho = function useEkho(_ref) {
126
130
 
127
131
  case 3:
128
132
  url = _context.sent;
129
- setCurrentPlaying(url);
130
133
 
131
- case 5:
134
+ if (!url) {
135
+ onError();
136
+ } else {
137
+ setCurrentPlaying(url);
138
+ }
139
+
140
+ _context.next = 8;
141
+ break;
142
+
143
+ case 7:
144
+ onError();
145
+
146
+ case 8:
132
147
  case "end":
133
148
  return _context.stop();
134
149
  }
@@ -139,25 +154,33 @@ var useEkho = function useEkho(_ref) {
139
154
  return function (_x) {
140
155
  return _ref3.apply(this, arguments);
141
156
  };
142
- }(), [emitEvent, setCurrentPlaying]);
143
- (0, _react.useEffect)(function () {
144
- if (currentPlaying.current.url && noAudio) {
157
+ }(), [emitEvent, onError, setCurrentPlaying]);
158
+ var stopCurrentAudio = (0, _react.useCallback)(function () {
159
+ if (currentPlaying.current.url) {
145
160
  stop(currentPlaying.current.cc);
146
161
  }
147
- }, [noAudio, stop]);
162
+ }, [stop]);
163
+ (0, _react.useEffect)(function () {
164
+ if (noAudio) {
165
+ stopCurrentAudio();
166
+ }
167
+ }, [noAudio, stopCurrentAudio]);
148
168
  (0, _react.useEffect)(function () {
149
- if (isMounted) {
169
+ if (isMounted && started) {
150
170
  if (audioType === 'voice' && voice !== null && voice !== void 0 && voice.id) {
151
171
  var voiceId = getVoice(voice);
152
172
  playSpeech({
153
173
  voiceId: voiceId,
154
174
  text: text
155
175
  });
156
- } else if (audioType === 'file' || !audioType && audio) {
176
+ } else if ((audioType === 'file' || !audioType) && audio) {
157
177
  setCurrentPlaying(audio === null || audio === void 0 ? void 0 : audio.url);
178
+ } else {
179
+ onError();
158
180
  }
159
181
  }
160
- }, [getVoice, playSpeech, isMounted, voice, text, audioType, audio === null || audio === void 0 ? void 0 : audio.url, audio, setCurrentPlaying]);
182
+ }, [getVoice, playSpeech, isMounted, voice, text, audioType, audio === null || audio === void 0 ? void 0 : audio.url, audio, setCurrentPlaying, onError, started]);
183
+ return stopCurrentAudio;
161
184
  };
162
185
 
163
186
  var _default = useEkho;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@gamelearn/arcade-components",
3
3
  "author": "Gamelearn",
4
4
  "license": "unlicense",
5
- "version": "1.17.2",
5
+ "version": "1.18.1",
6
6
  "main": "dist/index.js",
7
7
  "files": [
8
8
  "dist",