@gamelearn/arcade-components 1.17.2 → 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,12 +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 = (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
132
 
124
- if (automatic && ((slide === null || slide === void 0 ? void 0 : slide.audioType) === 'none' || !audio || !voice)) {
133
+ if (automatic && ((slide === null || slide === void 0 ? void 0 : slide.audioType) === 'none' || audioFailed)) {
125
134
  var _slide$vignettes$, _slide$vignettes$$tex;
126
135
 
127
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);
@@ -131,7 +140,7 @@ var ComicComponent = function ComicComponent(_ref) {
131
140
  return function () {
132
141
  stop();
133
142
  };
134
- }, [automatic, goToNextSlide, slideCount, slides, start, stop]);
143
+ }, [audioFailed, automatic, goToNextSlide, slideCount, slides, start, stop]);
135
144
  if (!(slides !== null && slides !== void 0 && slides.length)) return null;
136
145
  return /*#__PURE__*/_react.default.createElement("div", {
137
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,15 +289,16 @@ 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
292
  (0, _useEkho.default)({
286
293
  audioType: currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType,
287
- 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,
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();
@@ -297,7 +307,7 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
297
307
  }); // Autoplay logic
298
308
 
299
309
  (0, _react.useEffect)(function () {
300
- if (autoplayCond && ((currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'none' || !audio || !voice)) {
310
+ if (autoplayCond && ((currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType) === 'none' || audioFailed)) {
301
311
  var _currentMessage$text;
302
312
 
303
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);
@@ -307,7 +317,7 @@ var ConversationProViewer = function ConversationProViewer(_ref) {
307
317
  return function () {
308
318
  stop();
309
319
  };
310
- }, [currentMessage, start, stop, handleClickNext, currentLineData === null || currentLineData === void 0 ? void 0 : currentLineData.audioType, autoplayCond, audio, voice]);
320
+ }, [currentMessage, start, stop, handleClickNext, currentLineData.audioType, autoplayCond, audioFailed]);
311
321
 
312
322
  var decisionPayload = _objectSpread(_objectSpread({}, currentLineData.payload), {}, {
313
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,16 +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 = (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
454
+ var audio = Object.keys(currentLine.audio || {}).length;
455
+ var voice = Object.keys(currentLine.voice || {}).length; // Sound logic
447
456
 
448
457
  (0, _useEkho.default)({
449
458
  audioType: currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType,
450
- 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,
451
460
  text: currentMessage === null || currentMessage === void 0 ? void 0 : currentMessage.text,
452
461
  audio: currentLine === null || currentLine === void 0 ? void 0 : currentLine.audio,
453
462
  soundActions: soundActions,
454
463
  emitEvent: emitEvent,
464
+ onError: function onError() {
465
+ setAudioFailed(true);
466
+ },
455
467
  onFinish: function onFinish() {
456
468
  if (autoPlayCond) {
457
469
  nextLine();
@@ -460,7 +472,7 @@ var DialogComponent = function DialogComponent(_ref) {
460
472
  }); // Autoplay logic
461
473
 
462
474
  (0, _react.useEffect)(function () {
463
- if (autoPlayCond && currentMessage.show && ((currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'none' || !audio || !voice)) {
475
+ if (autoPlayCond && currentMessage.show && ((currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType) === 'none' || audioFailed)) {
464
476
  var _currentMessage$text;
465
477
 
466
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);
@@ -470,7 +482,7 @@ var DialogComponent = function DialogComponent(_ref) {
470
482
  return function () {
471
483
  stop();
472
484
  };
473
- }, [currentMessage, nextLine, start, stop, currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType, autoPlayCond, audio, voice]); // Positioning logic
485
+ }, [currentMessage, nextLine, start, stop, currentLine === null || currentLine === void 0 ? void 0 : currentLine.audioType, autoPlayCond, audio, voice, audioFailed]); // Positioning logic
474
486
 
475
487
  var checkBubblePosition = (0, _react.useCallback)(function () {
476
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.2",
5
+ "version": "1.18.0",
6
6
  "main": "dist/index.js",
7
7
  "files": [
8
8
  "dist",