@memori.ai/memori-react 2.9.2 → 2.10.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.
Files changed (32) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/components/ChatBubble/ChatBubble.js +31 -31
  3. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  4. package/dist/components/MemoriWidget/MemoriWidget.d.ts +16 -1
  5. package/dist/components/MemoriWidget/MemoriWidget.js +242 -226
  6. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  7. package/dist/components/StartPanel/StartPanel.js +6 -1
  8. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  9. package/dist/helpers/utils.d.ts +1 -0
  10. package/dist/helpers/utils.js +5 -1
  11. package/dist/helpers/utils.js.map +1 -1
  12. package/dist/helpers/utils.test.js +12 -0
  13. package/dist/helpers/utils.test.js.map +1 -1
  14. package/esm/components/ChatBubble/ChatBubble.js +31 -31
  15. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  16. package/esm/components/MemoriWidget/MemoriWidget.d.ts +16 -1
  17. package/esm/components/MemoriWidget/MemoriWidget.js +243 -227
  18. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  19. package/esm/components/StartPanel/StartPanel.js +6 -1
  20. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  21. package/esm/helpers/utils.d.ts +1 -0
  22. package/esm/helpers/utils.js +3 -0
  23. package/esm/helpers/utils.js.map +1 -1
  24. package/esm/helpers/utils.test.js +13 -1
  25. package/esm/helpers/utils.test.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/components/ChatBubble/ChatBubble.tsx +1 -1
  28. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +0 -3
  29. package/src/components/MemoriWidget/MemoriWidget.tsx +353 -292
  30. package/src/components/StartPanel/StartPanel.tsx +8 -3
  31. package/src/helpers/utils.test.ts +15 -1
  32. package/src/helpers/utils.ts +4 -0
@@ -46,41 +46,20 @@ const getMemoriState = (integrationId) => {
46
46
  let dialogState = JSON.parse(engineState);
47
47
  return dialogState;
48
48
  };
49
- function setNativeValue(element, value) {
50
- var _a, _b, _c, _d;
51
- const valueSetter = (_b = (_a = Object === null || Object === void 0 ? void 0 : Object.getOwnPropertyDescriptor) === null || _a === void 0 ? void 0 : _a.call(Object, element, 'value')) === null || _b === void 0 ? void 0 : _b.set;
52
- const prototype = Object.getPrototypeOf(element);
53
- const prototypeValueSetter = (_d = (_c = Object === null || Object === void 0 ? void 0 : Object.getOwnPropertyDescriptor) === null || _c === void 0 ? void 0 : _c.call(Object, prototype, 'value')) === null || _d === void 0 ? void 0 : _d.set;
54
- if (prototypeValueSetter &&
55
- valueSetter &&
56
- valueSetter !== prototypeValueSetter) {
57
- prototypeValueSetter.call(element, value);
58
- }
59
- else if (valueSetter) {
60
- valueSetter.call(element, value);
61
- }
62
- }
63
- const typeMessage = (message) => {
64
- var _a, _b;
65
- let textarea = document.querySelector('fieldset#chat-fieldset textarea') ||
66
- ((_b = (_a = document
67
- .querySelector('memori-client')) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('fieldset#chat-fieldset textarea'));
68
- if (!textarea)
69
- return;
70
- setNativeValue(textarea, message);
71
- textarea.dispatchEvent(new Event('input', { bubbles: true }));
72
- setTimeout(() => {
73
- var _a, _b;
74
- let sendButton = document.querySelector('button.memori-chat-inputs--send') ||
75
- ((_b = (_a = document
76
- .querySelector('memori-client')) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('button.memori-chat-inputs--send'));
77
- if (!sendButton)
78
- return;
79
- sendButton.click();
80
- }, 100);
49
+ const typeMessage = (message, waitForPrevious = true, hidden = false) => {
50
+ const e = new CustomEvent('MemoriTextEntered', {
51
+ detail: {
52
+ text: message,
53
+ waitForPrevious,
54
+ hidden,
55
+ },
56
+ });
57
+ document.dispatchEvent(e);
81
58
  };
59
+ const typeMessageHidden = (message, waitForPrevious = true) => typeMessage(message, waitForPrevious, true);
82
60
  window.getMemoriState = getMemoriState;
83
61
  window.typeMessage = typeMessage;
62
+ window.typeMessageHidden = typeMessageHidden;
84
63
  let recognizer;
85
64
  let speechConfig;
86
65
  let speechSynthesizer;
@@ -88,6 +67,7 @@ let audioDestination;
88
67
  let audioContext;
89
68
  let memoriPassword;
90
69
  let speakerMuted = false;
70
+ let memoriSpeaking = false;
91
71
  const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integration, layout = 'DEFAULT', customLayout, showInstruct = false, showShare, preview = false, embed = false, showInputs = true, showDates = false, showContextPerLine = false, showSettings = true, height = '100vh', secret, baseUrl = 'https://app.twincreator.com', apiUrl = 'https://backend.memori.ai', initialContextVars, initialQuestion, ogImage, sessionID: initialSessionID, tenant, personification, authToken, AZURE_COGNITIVE_SERVICES_TTS_KEY, onStateChange, additionalInfo, additionalSettings, customMediaRenderer, }) => {
92
72
  var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _t, _u, _v, _w, _x, _y;
93
73
  const { t, i18n } = (0, react_i18next_1.useTranslation)();
@@ -123,6 +103,7 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
123
103
  const [hideEmissions, setHideEmissions] = (0, react_1.useState)(false);
124
104
  (0, react_1.useEffect)(() => {
125
105
  setIsPlayingAudio(!!speechSynthesizer);
106
+ memoriSpeaking = !!speechSynthesizer;
126
107
  }, [speechSynthesizer]);
127
108
  (0, react_1.useEffect)(() => {
128
109
  let defaultControlsPosition = 'bottom';
@@ -169,199 +150,6 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
169
150
  _setPosition(venue);
170
151
  applyPosition(venue);
171
152
  };
172
- const [userMessage, setUserMessage] = (0, react_1.useState)('');
173
- const onChangeUserMessage = (value) => {
174
- if (!value || value === '\n' || value.trim() === '') {
175
- setUserMessage('');
176
- resetInteractionTimeout();
177
- return;
178
- }
179
- setUserMessage(value);
180
- clearInteractionTimeout();
181
- };
182
- const [listening, setListening] = (0, react_1.useState)(false);
183
- const [history, setHistory] = (0, react_1.useState)([]);
184
- const pushMessage = (message) => {
185
- setHistory(history => [...history, { ...message }]);
186
- };
187
- const sendMessage = async (text, media, newSessionId, translate = true, translatedText) => {
188
- var _a, _b, _c, _d, _f;
189
- if (!sessionId || !(text === null || text === void 0 ? void 0 : text.length))
190
- return;
191
- pushMessage({
192
- text: text,
193
- translatedText,
194
- fromUser: true,
195
- media: media !== null && media !== void 0 ? media : [],
196
- initial: !!newSessionId,
197
- });
198
- setMemoriTyping(true);
199
- const language = (_d = (_c = (_b = (_a = memori.culture) === null || _a === void 0 ? void 0 : _a.split('-')) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : i18n.language) !== null && _d !== void 0 ? _d : 'IT';
200
- let msg = text;
201
- if (translate &&
202
- !instruct &&
203
- isMultilanguageEnabled &&
204
- userLang.toUpperCase() !== language.toUpperCase()) {
205
- const translation = await (0, translations_1.getTranslation)(text, language, userLang, baseUrl);
206
- msg = translation.text;
207
- }
208
- const { currentState, ...response } = await postTextEnteredEvent({
209
- sessionId: newSessionId !== null && newSessionId !== void 0 ? newSessionId : sessionId,
210
- text: msg,
211
- });
212
- if (response.resultCode === 0 && currentState) {
213
- const emission = (_f = currentState.emission) !== null && _f !== void 0 ? _f : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
214
- if (currentState.state === 'X4' && memori.giverTag) {
215
- const { currentState, ...resp } = await postTagChangedEvent(sessionId, memori.giverTag);
216
- if (resp.resultCode === 0) {
217
- setCurrentDialogState(currentState);
218
- if (currentState.emission) {
219
- pushMessage({
220
- text: currentState.emission,
221
- media: currentState.media,
222
- fromUser: false,
223
- });
224
- speak(currentState.emission);
225
- }
226
- }
227
- else {
228
- console.error(response, resp);
229
- Message_1.default.error(t((0, error_1.getErrori18nKey)(resp.resultCode)));
230
- }
231
- }
232
- else if (currentState.state === 'X2d' && memori.giverTag) {
233
- const { currentState, ...resp } = await postTextEnteredEvent({
234
- sessionId: newSessionId !== null && newSessionId !== void 0 ? newSessionId : sessionId,
235
- text: Math.random().toString().substring(2, 8),
236
- });
237
- if (resp.resultCode === 0) {
238
- const { currentState, ...resp } = await postTagChangedEvent(sessionId, memori.giverTag);
239
- if (resp.resultCode === 0) {
240
- setCurrentDialogState(currentState);
241
- if (currentState.emission) {
242
- pushMessage({
243
- text: currentState.emission,
244
- media: currentState.media,
245
- fromUser: false,
246
- });
247
- speak(currentState.emission);
248
- }
249
- }
250
- else {
251
- console.error(response, resp);
252
- Message_1.default.error(t((0, error_1.getErrori18nKey)(resp.resultCode)));
253
- }
254
- }
255
- else {
256
- console.error(response, resp);
257
- Message_1.default.error(t((0, error_1.getErrori18nKey)(resp.resultCode)));
258
- }
259
- }
260
- else if (userLang.toLowerCase() !== language.toLowerCase() &&
261
- emission &&
262
- !instruct &&
263
- isMultilanguageEnabled) {
264
- translateDialogState(currentState, userLang).then(ts => {
265
- if (ts.emission) {
266
- speak(ts.emission);
267
- }
268
- });
269
- }
270
- else {
271
- setCurrentDialogState({
272
- ...currentState,
273
- emission,
274
- });
275
- if (emission) {
276
- pushMessage({
277
- text: emission,
278
- media: currentState.media,
279
- fromUser: false,
280
- generatedByAI: !!currentState.completion,
281
- });
282
- speak(emission);
283
- }
284
- }
285
- }
286
- else if (response.resultCode === 404) {
287
- setHistory(h => [...h.slice(0, h.length - 1)]);
288
- reopenSession(false, memoriPwd || memori.secretToken, memoriTokens, instruct && memori.giverTag ? memori.giverTag : undefined, instruct && memori.giverPIN ? memori.giverPIN : undefined, initialContextVars, initialQuestion).then(state => {
289
- console.info('session timeout');
290
- if (state === null || state === void 0 ? void 0 : state.sessionID) {
291
- setTimeout(() => {
292
- sendMessage(text, media, state === null || state === void 0 ? void 0 : state.sessionID);
293
- }, 500);
294
- }
295
- });
296
- }
297
- setMemoriTyping(false);
298
- };
299
- const translateDialogState = async (state, userLang) => {
300
- var _a, _b, _c, _d, _f, _g, _h;
301
- const language = (_d = (_c = (_b = (_a = memori.culture) === null || _a === void 0 ? void 0 : _a.split('-')) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : i18n.language) !== null && _d !== void 0 ? _d : 'IT';
302
- const emission = (_f = state.emission) !== null && _f !== void 0 ? _f : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
303
- let translatedState = { ...state };
304
- let translatedMsg = null;
305
- if (!emission ||
306
- instruct ||
307
- language.toUpperCase() === userLang.toUpperCase() ||
308
- !isMultilanguageEnabled) {
309
- translatedState = { ...state, emission };
310
- if (emission) {
311
- translatedMsg = {
312
- text: emission,
313
- media: state.media,
314
- fromUser: false,
315
- };
316
- }
317
- }
318
- else {
319
- const t = await (0, translations_1.getTranslation)(emission, userLang, language, baseUrl);
320
- if (state.hints && state.hints.length > 0) {
321
- const translatedHints = await Promise.all(((_g = state.hints) !== null && _g !== void 0 ? _g : []).map(async (hint) => {
322
- var _a;
323
- const tHint = await (0, translations_1.getTranslation)(hint, userLang, language, baseUrl);
324
- return {
325
- text: (_a = tHint === null || tHint === void 0 ? void 0 : tHint.text) !== null && _a !== void 0 ? _a : hint,
326
- originalText: hint,
327
- };
328
- }));
329
- translatedState = {
330
- ...state,
331
- emission: t.text,
332
- translatedHints,
333
- };
334
- }
335
- else {
336
- translatedState = {
337
- ...state,
338
- emission: t.text,
339
- hints: (_h = state.hints) !== null && _h !== void 0 ? _h : (state.state === 'G1' ? currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.hints : []),
340
- };
341
- }
342
- if (t.text.length > 0)
343
- translatedMsg = {
344
- text: t.text,
345
- media: state.media,
346
- fromUser: false,
347
- generatedByAI: !!state.completion,
348
- };
349
- }
350
- setCurrentDialogState(translatedState);
351
- if (translatedMsg) {
352
- pushMessage(translatedMsg);
353
- }
354
- return translatedState;
355
- };
356
- const minAge = memori.ageRestriction
357
- ? memori.ageRestriction
358
- : memori.nsfw
359
- ? 18
360
- : memori.enableCompletions
361
- ? 14
362
- : 0;
363
- const [birthDate, setBirthDate] = (0, react_1.useState)();
364
- const [showAgeVerification, setShowAgeVerification] = (0, react_1.useState)(false);
365
153
  const [sessionId, setSessionId] = (0, react_1.useState)(initialSessionID);
366
154
  const [currentDialogState, _setCurrentDialogState] = (0, react_1.useState)();
367
155
  const setCurrentDialogState = (state) => {
@@ -610,6 +398,201 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
610
398
  restoreGiverTag();
611
399
  };
612
400
  }, []);
401
+ const [userMessage, setUserMessage] = (0, react_1.useState)('');
402
+ const onChangeUserMessage = (value) => {
403
+ if (!value || value === '\n' || value.trim() === '') {
404
+ setUserMessage('');
405
+ resetInteractionTimeout();
406
+ return;
407
+ }
408
+ setUserMessage(value);
409
+ clearInteractionTimeout();
410
+ };
411
+ const [listening, setListening] = (0, react_1.useState)(false);
412
+ const [history, setHistory] = (0, react_1.useState)([]);
413
+ const pushMessage = (message) => {
414
+ setHistory(history => [...history, { ...message }]);
415
+ };
416
+ const sendMessage = (0, react_1.useCallback)(async (text, media, newSessionId, translate = true, translatedText, hidden = false) => {
417
+ var _a, _b, _c, _d, _f;
418
+ const sessionID = newSessionId || sessionId;
419
+ if (!sessionID || !(text === null || text === void 0 ? void 0 : text.length))
420
+ return;
421
+ if (!hidden)
422
+ pushMessage({
423
+ text: text,
424
+ translatedText,
425
+ fromUser: true,
426
+ media: media !== null && media !== void 0 ? media : [],
427
+ initial: !!newSessionId,
428
+ });
429
+ setMemoriTyping(true);
430
+ const language = (_d = (_c = (_b = (_a = memori.culture) === null || _a === void 0 ? void 0 : _a.split('-')) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : i18n.language) !== null && _d !== void 0 ? _d : 'IT';
431
+ let msg = text;
432
+ if (translate &&
433
+ !instruct &&
434
+ isMultilanguageEnabled &&
435
+ userLang.toUpperCase() !== language.toUpperCase()) {
436
+ const translation = await (0, translations_1.getTranslation)(text, language, userLang, baseUrl);
437
+ msg = translation.text;
438
+ }
439
+ const { currentState, ...response } = await postTextEnteredEvent({
440
+ sessionId: sessionID,
441
+ text: msg,
442
+ });
443
+ if (response.resultCode === 0 && currentState) {
444
+ const emission = (_f = currentState.emission) !== null && _f !== void 0 ? _f : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
445
+ if (currentState.state === 'X4' && memori.giverTag) {
446
+ const { currentState, ...resp } = await postTagChangedEvent(sessionID, memori.giverTag);
447
+ if (resp.resultCode === 0) {
448
+ setCurrentDialogState(currentState);
449
+ if (currentState.emission) {
450
+ pushMessage({
451
+ text: currentState.emission,
452
+ media: currentState.media,
453
+ fromUser: false,
454
+ });
455
+ speak(currentState.emission);
456
+ }
457
+ }
458
+ else {
459
+ console.error(response, resp);
460
+ Message_1.default.error(t((0, error_1.getErrori18nKey)(resp.resultCode)));
461
+ }
462
+ }
463
+ else if (currentState.state === 'X2d' && memori.giverTag) {
464
+ const { currentState, ...resp } = await postTextEnteredEvent({
465
+ sessionId: sessionID,
466
+ text: Math.random().toString().substring(2, 8),
467
+ });
468
+ if (resp.resultCode === 0) {
469
+ const { currentState, ...resp } = await postTagChangedEvent(sessionID, memori.giverTag);
470
+ if (resp.resultCode === 0) {
471
+ setCurrentDialogState(currentState);
472
+ if (currentState.emission) {
473
+ pushMessage({
474
+ text: currentState.emission,
475
+ media: currentState.media,
476
+ fromUser: false,
477
+ });
478
+ speak(currentState.emission);
479
+ }
480
+ }
481
+ else {
482
+ console.error(response, resp);
483
+ Message_1.default.error(t((0, error_1.getErrori18nKey)(resp.resultCode)));
484
+ }
485
+ }
486
+ else {
487
+ console.error(response, resp);
488
+ Message_1.default.error(t((0, error_1.getErrori18nKey)(resp.resultCode)));
489
+ }
490
+ }
491
+ else if (userLang.toLowerCase() !== language.toLowerCase() &&
492
+ emission &&
493
+ !instruct &&
494
+ isMultilanguageEnabled) {
495
+ translateDialogState(currentState, userLang).then(ts => {
496
+ if (ts.emission) {
497
+ speak(ts.emission);
498
+ }
499
+ });
500
+ }
501
+ else {
502
+ setCurrentDialogState({
503
+ ...currentState,
504
+ emission,
505
+ });
506
+ if (emission) {
507
+ pushMessage({
508
+ text: emission,
509
+ media: currentState.media,
510
+ fromUser: false,
511
+ generatedByAI: !!currentState.completion,
512
+ });
513
+ speak(emission);
514
+ }
515
+ }
516
+ }
517
+ else if (response.resultCode === 404) {
518
+ setHistory(h => [...h.slice(0, h.length - 1)]);
519
+ reopenSession(false, memoriPwd || memori.secretToken, memoriTokens, instruct && memori.giverTag ? memori.giverTag : undefined, instruct && memori.giverPIN ? memori.giverPIN : undefined, initialContextVars, initialQuestion).then(state => {
520
+ console.info('session timeout');
521
+ if (state === null || state === void 0 ? void 0 : state.sessionID) {
522
+ setTimeout(() => {
523
+ sendMessage(text, media, state === null || state === void 0 ? void 0 : state.sessionID);
524
+ }, 500);
525
+ }
526
+ });
527
+ }
528
+ setMemoriTyping(false);
529
+ }, [sessionId]);
530
+ const translateDialogState = async (state, userLang) => {
531
+ var _a, _b, _c, _d, _f, _g, _h;
532
+ const language = (_d = (_c = (_b = (_a = memori.culture) === null || _a === void 0 ? void 0 : _a.split('-')) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : i18n.language) !== null && _d !== void 0 ? _d : 'IT';
533
+ const emission = (_f = state.emission) !== null && _f !== void 0 ? _f : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
534
+ let translatedState = { ...state };
535
+ let translatedMsg = null;
536
+ if (!emission ||
537
+ instruct ||
538
+ language.toUpperCase() === userLang.toUpperCase() ||
539
+ !isMultilanguageEnabled) {
540
+ translatedState = { ...state, emission };
541
+ if (emission) {
542
+ translatedMsg = {
543
+ text: emission,
544
+ media: state.media,
545
+ fromUser: false,
546
+ };
547
+ }
548
+ }
549
+ else {
550
+ const t = await (0, translations_1.getTranslation)(emission, userLang, language, baseUrl);
551
+ if (state.hints && state.hints.length > 0) {
552
+ const translatedHints = await Promise.all(((_g = state.hints) !== null && _g !== void 0 ? _g : []).map(async (hint) => {
553
+ var _a;
554
+ const tHint = await (0, translations_1.getTranslation)(hint, userLang, language, baseUrl);
555
+ return {
556
+ text: (_a = tHint === null || tHint === void 0 ? void 0 : tHint.text) !== null && _a !== void 0 ? _a : hint,
557
+ originalText: hint,
558
+ };
559
+ }));
560
+ translatedState = {
561
+ ...state,
562
+ emission: t.text,
563
+ translatedHints,
564
+ };
565
+ }
566
+ else {
567
+ translatedState = {
568
+ ...state,
569
+ emission: t.text,
570
+ hints: (_h = state.hints) !== null && _h !== void 0 ? _h : (state.state === 'G1' ? currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.hints : []),
571
+ };
572
+ }
573
+ if (t.text.length > 0)
574
+ translatedMsg = {
575
+ text: t.text,
576
+ media: state.media,
577
+ fromUser: false,
578
+ generatedByAI: !!state.completion,
579
+ };
580
+ }
581
+ setCurrentDialogState(translatedState);
582
+ if (translatedMsg) {
583
+ pushMessage(translatedMsg);
584
+ }
585
+ return translatedState;
586
+ };
587
+ const minAge = memori.ageRestriction
588
+ ? memori.ageRestriction
589
+ : memori.nsfw
590
+ ? 18
591
+ : memori.enableCompletions
592
+ ? 14
593
+ : 0;
594
+ const [birthDate, setBirthDate] = (0, react_1.useState)();
595
+ const [showAgeVerification, setShowAgeVerification] = (0, react_1.useState)(false);
613
596
  const [userInteractionTimeout, setUserInteractionTimeout] = (0, react_1.useState)();
614
597
  const timeoutRef = (0, react_1.useRef)();
615
598
  const clearInteractionTimeout = () => {
@@ -879,6 +862,7 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
879
862
  if (preview)
880
863
  return;
881
864
  if (muteSpeaker || speakerMuted) {
865
+ memoriSpeaking = false;
882
866
  if (continuousSpeech) {
883
867
  setListeningTimeout();
884
868
  }
@@ -897,6 +881,7 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
897
881
  audioContext.suspend();
898
882
  if (isPlayingAudio) {
899
883
  try {
884
+ memoriSpeaking = false;
900
885
  if (speechSynthesizer) {
901
886
  speechSynthesizer.close();
902
887
  speechSynthesizer = null;
@@ -937,15 +922,18 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
937
922
  const source = audioContext.createBufferSource();
938
923
  source.addEventListener('ended', () => {
939
924
  setIsPlayingAudio(false);
925
+ memoriSpeaking = false;
940
926
  });
941
927
  audioDestination.onAudioEnd = () => {
942
928
  setIsPlayingAudio(false);
929
+ memoriSpeaking = false;
943
930
  source.disconnect();
944
931
  onEndSpeakStartListen();
945
932
  };
946
- speechSynthesizer.speakSsmlAsync(`<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" xml:lang="${getCultureCodeByLanguage(userLang)}"><voice name="${getTTSVoice(userLang)}"><s>${replaceTextWithPhonemes(escapeHTML(text), userLang.toLowerCase())}</s></voice></speak>`, result => {
933
+ speechSynthesizer.speakSsmlAsync(`<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" xml:lang="${getCultureCodeByLanguage(userLang)}"><voice name="${getTTSVoice(userLang)}"><s>${replaceTextWithPhonemes(escapeHTML((0, utils_1.stripEmojis)(text)), userLang.toLowerCase())}</s></voice></speak>`, result => {
947
934
  if (result) {
948
935
  setIsPlayingAudio(true);
936
+ memoriSpeaking = true;
949
937
  try {
950
938
  audioContext.decodeAudioData(result.audioData, function (buffer) {
951
939
  source.buffer = buffer;
@@ -959,6 +947,7 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
959
947
  audioContext.state === 'closed') {
960
948
  source.disconnect();
961
949
  setIsPlayingAudio(false);
950
+ memoriSpeaking = false;
962
951
  }
963
952
  else if (audioContext.state === 'interrupted') {
964
953
  audioContext.resume();
@@ -974,6 +963,7 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
974
963
  console.error('speak error: ', e);
975
964
  window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
976
965
  setIsPlayingAudio(false);
966
+ memoriSpeaking = false;
977
967
  if (speechSynthesizer) {
978
968
  speechSynthesizer.close();
979
969
  speechSynthesizer = null;
@@ -983,16 +973,19 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
983
973
  else {
984
974
  audioContext.resume();
985
975
  setIsPlayingAudio(false);
976
+ memoriSpeaking = false;
986
977
  }
987
978
  }, error => {
988
979
  console.error('speak:', error);
989
980
  window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
990
981
  setIsPlayingAudio(false);
982
+ memoriSpeaking = false;
991
983
  });
992
984
  setMemoriTyping(false);
993
985
  };
994
986
  const stopAudio = () => {
995
987
  setIsPlayingAudio(false);
988
+ memoriSpeaking = false;
996
989
  try {
997
990
  if (speechSynthesizer) {
998
991
  speechSynthesizer.close();
@@ -1349,6 +1342,29 @@ const MemoriWidget = ({ memori, memoriConfigs, memoriLang, multilingual, integra
1349
1342
  stopAudio();
1350
1343
  sendMessage(text, undefined, undefined, false, translatedText);
1351
1344
  };
1345
+ const memoriTextEnteredHandler = (0, react_1.useCallback)((e) => {
1346
+ var _a;
1347
+ const { text, waitForPrevious, hidden } = e.detail;
1348
+ const sessionID = sessionId || ((_a = window.getMemoriState()) === null || _a === void 0 ? void 0 : _a.sessionID);
1349
+ if (text) {
1350
+ if (waitForPrevious &&
1351
+ !speakerMuted &&
1352
+ (memoriSpeaking || memoriTyping)) {
1353
+ setTimeout(() => {
1354
+ memoriTextEnteredHandler(e);
1355
+ }, 1000);
1356
+ }
1357
+ else {
1358
+ sendMessage(text, undefined, sessionID, undefined, undefined, hidden);
1359
+ }
1360
+ }
1361
+ }, [sessionId, isPlayingAudio, memoriTyping]);
1362
+ (0, react_1.useEffect)(() => {
1363
+ document.addEventListener('MemoriTextEntered', memoriTextEnteredHandler);
1364
+ return () => {
1365
+ document.removeEventListener('MemoriTextEntered', memoriTextEnteredHandler);
1366
+ };
1367
+ }, []);
1352
1368
  const onClickStart = (0, react_1.useCallback)(async (session) => {
1353
1369
  const sessionID = (session === null || session === void 0 ? void 0 : session.sessionID) || sessionId;
1354
1370
  const dialogState = (session === null || session === void 0 ? void 0 : session.dialogState) || currentDialogState;