@gamelearn/arcade-components 1.17.1 → 1.18.0

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,19 +51,24 @@ 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];
@@ -101,13 +106,16 @@ var ComicComponent = function ComicComponent(_ref) {
101
106
  goToPreviousSlide();
102
107
  };
103
108
 
104
- (0, _useEkho.default)({
109
+ var stopEkho = (0, _useEkho.default)({
105
110
  audioType: slides === null || slides === void 0 ? void 0 : (_slides$slideCount = slides[slideCount]) === null || _slides$slideCount === void 0 ? void 0 : _slides$slideCount.audioType,
106
111
  voice: slides === null || slides === void 0 ? void 0 : (_slides$slideCount2 = slides[slideCount]) === null || _slides$slideCount2 === void 0 ? void 0 : _slides$slideCount2.voice,
107
112
  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
113
  audio: slides === null || slides === void 0 ? void 0 : (_slides$slideCount4 = slides[slideCount]) === null || _slides$slideCount4 === void 0 ? void 0 : _slides$slideCount4.audio,
109
114
  soundActions: soundActions,
110
115
  emitEvent: emitEvent,
116
+ onError: function onError() {
117
+ setAudioFailed(true);
118
+ },
111
119
  onFinish: function onFinish() {
112
120
  var _slides$slideCount5;
113
121
 
@@ -116,11 +124,13 @@ var ComicComponent = function ComicComponent(_ref) {
116
124
  }
117
125
  }
118
126
  });
127
+ (0, _react.useEffect)(function () {
128
+ stopEkho();
129
+ }, [slideCount, stopEkho]);
119
130
  (0, _react.useEffect)(function () {
120
131
  var slide = slides === null || slides === void 0 ? void 0 : slides[slideCount];
121
- var audio = Object.keys(slide.audio || {}).length;
122
132
 
123
- if (automatic && ((slide === null || slide === void 0 ? void 0 : slide.audioType) === 'none' || (slide === null || slide === void 0 ? void 0 : slide.audioType) === 'file' && !audio)) {
133
+ if (automatic && ((slide === null || slide === void 0 ? void 0 : slide.audioType) === 'none' || audioFailed)) {
124
134
  var _slide$vignettes$, _slide$vignettes$$tex;
125
135
 
126
136
  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);
@@ -130,7 +140,7 @@ var ComicComponent = function ComicComponent(_ref) {
130
140
  return function () {
131
141
  stop();
132
142
  };
133
- }, [automatic, goToNextSlide, slideCount, slides, start, stop]);
143
+ }, [audioFailed, automatic, goToNextSlide, slideCount, slides, start, stop]);
134
144
  if (!(slides !== null && slides !== void 0 && slides.length)) return null;
135
145
  return /*#__PURE__*/_react.default.createElement("div", {
136
146
  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,14 +289,16 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
280
289
  };
281
290
 
282
291
  var autoplayCond = automatic && !isDecision;
283
- var audio = Object.keys(currentLine.audio || {}).length;
284
292
  (0, _useEkho.default)({
285
293
  audioType: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType,
286
- voice: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.voice,
294
+ voice: currentMessage !== null && currentMessage !== void 0 && currentMessage.text ? currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.voice : null,
287
295
  text: currentMessage === null || currentMessage === void 0 ? void 0 : currentMessage.text,
288
296
  audio: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audio,
289
297
  soundActions: soundActions,
290
298
  emitEvent: emitEvent,
299
+ onError: function onError() {
300
+ setAudioFailed(true);
301
+ },
291
302
  onFinish: function onFinish() {
292
303
  if (autoplayCond && (currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) !== 'none') {
293
304
  handleClickNext();
@@ -296,7 +307,7 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
296
307
  }); // Autoplay logic
297
308
 
298
309
  (0, _react.useEffect)(function () {
299
- if (autoplayCond && ((currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'none' || (currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'file' && !audio)) {
310
+ if (autoplayCond && ((currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'none' || audioFailed)) {
300
311
  var _currentMessage$text;
301
312
 
302
313
  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);
@@ -306,7 +317,7 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
306
317
  return function () {
307
318
  stop();
308
319
  };
309
- }, [currentMessage, start, stop, handleClickNext, currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType, autoplayCond, audio]);
320
+ }, [currentMessage, start, stop, handleClickNext, currentLineData.audioType, autoplayCond, audioFailed]);
310
321
 
311
322
  var decisionPayload = _objectSpread(_objectSpread({}, currentLineData.payload), {}, {
312
323
  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
  }),
@@ -252,6 +257,8 @@ var DialogComponent = function DialogComponent(_ref) {
252
257
  }
253
258
  }, [currentLine.id, edges, finishConversation, lines]);
254
259
  var backLine = (0, _react.useCallback)(function () {
260
+ setAudioFailed(false);
261
+
255
262
  if (isBranched) {
256
263
  handleBranchDirection(false);
257
264
  } else if (lastLine && !(lastLine !== null && lastLine !== void 0 && lastLine.decision) || lastLine.type && !lastLine.type !== 'conversationalDecision') {
@@ -283,6 +290,8 @@ var DialogComponent = function DialogComponent(_ref) {
283
290
  }
284
291
  }, [currentLine.id, edges, finishConversation, lines]);
285
292
  var nextLine = (0, _react.useCallback)(function (choice, reset) {
293
+ setAudioFailed(false);
294
+
286
295
  if (isBranched) {
287
296
  if (choice) {
288
297
  handleDecisionBranch(choice, reset);
@@ -442,15 +451,19 @@ var DialogComponent = function DialogComponent(_ref) {
442
451
  }
443
452
  }, [actors, camera, currentLine, zoomInActor, getCurrentVisible, translate, getAvatarURL, loadEmotion, resetCameraView, isDecision, isVoiceOver]);
444
453
  var autoPlayCond = automatic && !currentLine.decision;
445
- var audio = Object.keys(currentLine.audio || {}).length; // Sound logic
454
+ var audio = Object.keys(currentLine.audio || {}).length;
455
+ var voice = Object.keys(currentLine.voice || {}).length; // Sound logic
446
456
 
447
457
  (0, _useEkho.default)({
448
458
  audioType: currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType,
449
- voice: currentLine === null || currentLine === void 0 ? void 0 : currentLine.voice,
459
+ voice: currentMessage !== null && currentMessage !== void 0 && currentMessage.text ? currentLine === null || currentLine === void 0 ? void 0 : currentLine.voice : null,
450
460
  text: currentMessage === null || currentMessage === void 0 ? void 0 : currentMessage.text,
451
461
  audio: currentLine === null || currentLine === void 0 ? void 0 : currentLine.audio,
452
462
  soundActions: soundActions,
453
463
  emitEvent: emitEvent,
464
+ onError: function onError() {
465
+ setAudioFailed(true);
466
+ },
454
467
  onFinish: function onFinish() {
455
468
  if (autoPlayCond) {
456
469
  nextLine();
@@ -459,7 +472,7 @@ var DialogComponent = function DialogComponent(_ref) {
459
472
  }); // Autoplay logic
460
473
 
461
474
  (0, _react.useEffect)(function () {
462
- if (autoPlayCond && currentMessage.show && ((currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'none' || (currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'file' && !audio)) {
475
+ if (autoPlayCond && currentMessage.show && ((currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'none' || audioFailed)) {
463
476
  var _currentMessage$text;
464
477
 
465
478
  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);
@@ -469,7 +482,7 @@ var DialogComponent = function DialogComponent(_ref) {
469
482
  return function () {
470
483
  stop();
471
484
  };
472
- }, [currentMessage, nextLine, start, stop, currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType, autoPlayCond, audio]); // Positioning logic
485
+ }, [currentMessage, nextLine, start, stop, currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType, autoPlayCond, audio, voice, audioFailed]); // Positioning logic
473
486
 
474
487
  var checkBubblePosition = (0, _react.useCallback)(function () {
475
488
  if (bubbleRef.current && currentLine.slots) {
@@ -38,6 +38,8 @@ var useEkho = function useEkho(_ref) {
38
38
  emitEvent = _ref.emitEvent,
39
39
  _ref$onFinish = _ref.onFinish,
40
40
  onFinish = _ref$onFinish === void 0 ? noop : _ref$onFinish,
41
+ _ref$onError = _ref.onError,
42
+ onError = _ref$onError === void 0 ? noop : _ref$onError,
41
43
  _ref$onStart = _ref.onStart,
42
44
  onStart = _ref$onStart === void 0 ? noop : _ref$onStart;
43
45
 
@@ -114,7 +116,7 @@ var useEkho = function useEkho(_ref) {
114
116
  switch (_context.prev = _context.next) {
115
117
  case 0:
116
118
  if (!(payload.voiceId && payload.text)) {
117
- _context.next = 5;
119
+ _context.next = 7;
118
120
  break;
119
121
  }
120
122
 
@@ -126,9 +128,22 @@ var useEkho = function useEkho(_ref) {
126
128
 
127
129
  case 3:
128
130
  url = _context.sent;
129
- setCurrentPlaying(url);
130
131
 
131
- case 5:
132
+ if (!url) {
133
+ onError();
134
+ } else {
135
+ setCurrentPlaying(url);
136
+ }
137
+
138
+ _context.next = 8;
139
+ break;
140
+
141
+ case 7:
142
+ if (!payload.voiceId) {
143
+ onError();
144
+ }
145
+
146
+ case 8:
132
147
  case "end":
133
148
  return _context.stop();
134
149
  }
@@ -139,12 +154,17 @@ 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
169
  if (isMounted) {
150
170
  if (audioType === 'voice' && voice !== null && voice !== void 0 && voice.id) {
@@ -153,11 +173,14 @@ var useEkho = function useEkho(_ref) {
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]);
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.1",
5
+ "version": "1.18.0",
6
6
  "main": "dist/index.js",
7
7
  "files": [
8
8
  "dist",