@memori.ai/memori-react 2.16.0 → 2.17.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +18 -16
  3. package/dist/components/Chat/Chat.js +1 -1
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.d.ts +1 -0
  6. package/dist/components/ChatBubble/ChatBubble.js +2 -2
  7. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  8. package/dist/components/MemoriWidget/MemoriWidget.d.ts +4 -3
  9. package/dist/components/MemoriWidget/MemoriWidget.js +41 -25
  10. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  11. package/dist/components/layouts/WebsiteAssistant.d.ts +4 -0
  12. package/dist/components/layouts/WebsiteAssistant.js +31 -0
  13. package/dist/components/layouts/WebsiteAssistant.js.map +1 -0
  14. package/dist/components/layouts/WebsiteAssistant.test.d.ts +1 -0
  15. package/dist/components/layouts/WebsiteAssistant.test.js +25 -0
  16. package/dist/components/layouts/WebsiteAssistant.test.js.map +1 -0
  17. package/dist/components/layouts/chat.css +2 -2
  18. package/dist/components/layouts/totem.css +2 -2
  19. package/dist/components/layouts/website-assistant.css +353 -0
  20. package/dist/index.js +7 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/styles.css +2 -1
  23. package/esm/components/Chat/Chat.js +1 -1
  24. package/esm/components/Chat/Chat.js.map +1 -1
  25. package/esm/components/ChatBubble/ChatBubble.d.ts +1 -0
  26. package/esm/components/ChatBubble/ChatBubble.js +2 -2
  27. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  28. package/esm/components/MemoriWidget/MemoriWidget.d.ts +4 -3
  29. package/esm/components/MemoriWidget/MemoriWidget.js +41 -25
  30. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  31. package/esm/components/layouts/WebsiteAssistant.d.ts +4 -0
  32. package/esm/components/layouts/WebsiteAssistant.js +28 -0
  33. package/esm/components/layouts/WebsiteAssistant.js.map +1 -0
  34. package/esm/components/layouts/WebsiteAssistant.test.d.ts +1 -0
  35. package/esm/components/layouts/WebsiteAssistant.test.js +22 -0
  36. package/esm/components/layouts/WebsiteAssistant.test.js.map +1 -0
  37. package/esm/components/layouts/chat.css +2 -2
  38. package/esm/components/layouts/totem.css +2 -2
  39. package/esm/components/layouts/website-assistant.css +353 -0
  40. package/esm/index.js +7 -1
  41. package/esm/index.js.map +1 -1
  42. package/esm/styles.css +2 -1
  43. package/package.json +1 -1
  44. package/src/components/Chat/Chat.tsx +1 -0
  45. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +24 -0
  46. package/src/components/ChatBubble/ChatBubble.tsx +5 -1
  47. package/src/components/MemoriWidget/MemoriWidget.tsx +68 -34
  48. package/src/components/layouts/WebsiteAssistant.test.tsx +31 -0
  49. package/src/components/layouts/WebsiteAssistant.tsx +124 -0
  50. package/src/components/layouts/__snapshots__/WebsiteAssistant.test.tsx.snap +60 -0
  51. package/src/components/layouts/chat.css +2 -2
  52. package/src/components/layouts/layouts.stories.tsx +109 -0
  53. package/src/components/layouts/totem.css +2 -2
  54. package/src/components/layouts/website-assistant.css +353 -0
  55. package/src/index.tsx +7 -1
  56. package/src/styles.css +2 -1
@@ -56,6 +56,7 @@ import PoweredBy from '../PoweredBy/PoweredBy';
56
56
  import FullPageLayout from '../layouts/FullPage';
57
57
  import TotemLayout from '../layouts/Totem';
58
58
  import ChatLayout from '../layouts/Chat';
59
+ import WebsiteAssistantLayout from '../layouts/WebsiteAssistant';
59
60
 
60
61
  // Helpers / Utils
61
62
  import { getTranslation } from '../../helpers/translations';
@@ -100,6 +101,7 @@ type MemoriTextEnteredEvent = CustomEvent<{
100
101
  hidden?: boolean;
101
102
  typingText?: string;
102
103
  useLoaderTextAsMsg?: boolean;
104
+ hasBatchQueued?: boolean;
103
105
  }>;
104
106
 
105
107
  const typeMessage = (
@@ -107,7 +109,8 @@ const typeMessage = (
107
109
  waitForPrevious = true,
108
110
  hidden = false,
109
111
  typingText?: string,
110
- useLoaderTextAsMsg = false
112
+ useLoaderTextAsMsg = false,
113
+ hasBatchQueued = false
111
114
  ) => {
112
115
  const e: MemoriTextEnteredEvent = new CustomEvent('MemoriTextEntered', {
113
116
  detail: {
@@ -116,6 +119,7 @@ const typeMessage = (
116
119
  hidden,
117
120
  typingText,
118
121
  useLoaderTextAsMsg,
122
+ hasBatchQueued,
119
123
  },
120
124
  });
121
125
 
@@ -125,9 +129,17 @@ const typeMessageHidden = (
125
129
  message: string,
126
130
  waitForPrevious = true,
127
131
  typingText?: string,
128
- useLoaderTextAsMsg = false
132
+ useLoaderTextAsMsg = false,
133
+ hasBatchQueued = false
129
134
  ) =>
130
- typeMessage(message, waitForPrevious, true, typingText, useLoaderTextAsMsg);
135
+ typeMessage(
136
+ message,
137
+ waitForPrevious,
138
+ true,
139
+ typingText,
140
+ useLoaderTextAsMsg,
141
+ hasBatchQueued
142
+ );
131
143
 
132
144
  const typeBatchMessages = (
133
145
  messages: {
@@ -193,7 +205,8 @@ const typeBatchMessages = (
193
205
  step.waitForPrevious,
194
206
  step.hidden,
195
207
  step.typingText,
196
- step.useLoaderTextAsMsg
208
+ step.useLoaderTextAsMsg,
209
+ !next.done
197
210
  );
198
211
  } else if (areInputsDisabled()) {
199
212
  reEnableInputs();
@@ -277,7 +290,7 @@ export interface Props {
277
290
  memoriLang?: string;
278
291
  multilingual?: boolean;
279
292
  integration?: Integration;
280
- layout?: 'DEFAULT' | 'FULLPAGE' | 'TOTEM' | 'CHAT';
293
+ layout?: 'DEFAULT' | 'FULLPAGE' | 'TOTEM' | 'CHAT' | 'WEBSITE_ASSISTANT';
281
294
  customLayout?: React.FC<LayoutProps>;
282
295
  showShare?: boolean;
283
296
  showInstruct?: boolean;
@@ -519,7 +532,8 @@ const MemoriWidget = ({
519
532
  translatedText?: string,
520
533
  hidden: boolean = false,
521
534
  typingText?: string,
522
- useLoaderTextAsMsg = false
535
+ useLoaderTextAsMsg = false,
536
+ hasBatchQueued = false
523
537
  ) => {
524
538
  const sessionID =
525
539
  newSessionId ||
@@ -673,9 +687,9 @@ const MemoriWidget = ({
673
687
  });
674
688
  }
675
689
 
676
- if (gotError) {
677
- setMemoriTyping(false);
690
+ if (!hasBatchQueued) {
678
691
  setTypingText(undefined);
692
+ setMemoriTyping(false);
679
693
  }
680
694
  };
681
695
 
@@ -815,15 +829,6 @@ const MemoriWidget = ({
815
829
  dialogState: DialogState;
816
830
  sessionID: string;
817
831
  } | void> => {
818
- if (
819
- memori.privacyType !== 'PUBLIC' &&
820
- !memori.secretToken &&
821
- !memoriPwd &&
822
- !memoriTokens
823
- ) {
824
- setAuthModalState('password');
825
- return;
826
- }
827
832
  let storageBirthDate = getLocalConfig<string | undefined>(
828
833
  'birthDate',
829
834
  undefined
@@ -833,6 +838,15 @@ const MemoriWidget = ({
833
838
  return;
834
839
  }
835
840
 
841
+ if (
842
+ memori.privacyType !== 'PUBLIC' &&
843
+ !memori.secretToken &&
844
+ !memoriPwd &&
845
+ !memoriTokens
846
+ ) {
847
+ setAuthModalState('password');
848
+ return;
849
+ }
836
850
  setLoading(true);
837
851
  try {
838
852
  if (!memori.giverTag && !!memori.receivedInvitations?.length) {
@@ -884,6 +898,9 @@ const MemoriWidget = ({
884
898
  console.error(session);
885
899
  message.error(t('underageTwinSession', { age: minAge }));
886
900
  setGotErrorInOpening(true);
901
+ } else if (session?.resultCode === 403) {
902
+ setMemoriPwd(undefined);
903
+ setAuthModalState('password');
887
904
  } else {
888
905
  console.error(session);
889
906
  message.error(t(getErrori18nKey(session?.resultCode)));
@@ -906,6 +923,15 @@ const MemoriWidget = ({
906
923
  ) => {
907
924
  setLoading(true);
908
925
  try {
926
+ let storageBirthDate = getLocalConfig<string | undefined>(
927
+ 'birthDate',
928
+ undefined
929
+ );
930
+ if (!(birthDate || storageBirthDate) && !!minAge) {
931
+ setShowAgeVerification(true);
932
+ return;
933
+ }
934
+
909
935
  if (
910
936
  memori.privacyType !== 'PUBLIC' &&
911
937
  !password &&
@@ -918,15 +944,6 @@ const MemoriWidget = ({
918
944
  return;
919
945
  }
920
946
 
921
- let storageBirthDate = getLocalConfig<string | undefined>(
922
- 'birthDate',
923
- undefined
924
- );
925
- if (!(birthDate || storageBirthDate) && !!minAge) {
926
- setShowAgeVerification(true);
927
- return;
928
- }
929
-
930
947
  let referral;
931
948
  try {
932
949
  referral = (() => {
@@ -965,12 +982,14 @@ const MemoriWidget = ({
965
982
  text: currentState.emission,
966
983
  media: currentState.media,
967
984
  fromUser: false,
985
+ initial: true,
968
986
  },
969
987
  ])
970
988
  : pushMessage({
971
989
  text: currentState.emission,
972
990
  media: currentState.media,
973
991
  fromUser: false,
992
+ initial: true,
974
993
  });
975
994
  }
976
995
  }
@@ -988,6 +1007,9 @@ const MemoriWidget = ({
988
1007
  console.error(response);
989
1008
  message.error(t('underageTwinSession', { age: minAge }));
990
1009
  setGotErrorInOpening(true);
1010
+ } else if (response?.resultCode === 403) {
1011
+ setMemoriPwd(undefined);
1012
+ setAuthModalState('password');
991
1013
  } else {
992
1014
  console.error(response);
993
1015
  message.error(t(getErrori18nKey(response.resultCode)));
@@ -1471,7 +1493,10 @@ const MemoriWidget = ({
1471
1493
  };
1472
1494
 
1473
1495
  const speak = (text: string): void => {
1474
- if (!AZURE_COGNITIVE_SERVICES_TTS_KEY) return;
1496
+ if (!AZURE_COGNITIVE_SERVICES_TTS_KEY || preview) {
1497
+ emitEndSpeakEvent();
1498
+ return;
1499
+ }
1475
1500
  stopListening();
1476
1501
  // stopAudio();
1477
1502
 
@@ -2118,8 +2143,14 @@ const MemoriWidget = ({
2118
2143
  // to use in integrations or snippets
2119
2144
  const memoriTextEnteredHandler = useCallback(
2120
2145
  (e: MemoriTextEnteredEvent) => {
2121
- const { text, waitForPrevious, hidden, typingText, useLoaderTextAsMsg } =
2122
- e.detail;
2146
+ const {
2147
+ text,
2148
+ waitForPrevious,
2149
+ hidden,
2150
+ typingText,
2151
+ useLoaderTextAsMsg,
2152
+ hasBatchQueued,
2153
+ } = e.detail;
2123
2154
 
2124
2155
  if (text) {
2125
2156
  // wait to finish reading previous emission
@@ -2142,7 +2173,8 @@ const MemoriWidget = ({
2142
2173
  undefined,
2143
2174
  hidden,
2144
2175
  typingText,
2145
- useLoaderTextAsMsg
2176
+ useLoaderTextAsMsg,
2177
+ hasBatchQueued
2146
2178
  );
2147
2179
  }
2148
2180
  }
@@ -2185,7 +2217,10 @@ const MemoriWidget = ({
2185
2217
  );
2186
2218
  let birth = birthDate || storageBirthDate || undefined;
2187
2219
 
2188
- if (
2220
+ if (!sessionID && !!minAge && !birth) {
2221
+ setShowAgeVerification(true);
2222
+ setClickedStart(false);
2223
+ } else if (
2189
2224
  (!sessionID &&
2190
2225
  memori.privacyType !== 'PUBLIC' &&
2191
2226
  !memori.secretToken &&
@@ -2196,9 +2231,6 @@ const MemoriWidget = ({
2196
2231
  setAuthModalState('password');
2197
2232
  setClickedStart(false);
2198
2233
  return;
2199
- } else if (!sessionID && !!minAge && !birth) {
2200
- setShowAgeVerification(true);
2201
- setClickedStart(false);
2202
2234
  } else if (!sessionID) {
2203
2235
  setClickedStart(false);
2204
2236
  setGotErrorInOpening(false);
@@ -2617,6 +2649,8 @@ const MemoriWidget = ({
2617
2649
  ? ChatLayout
2618
2650
  : selectedLayout === 'FULLPAGE'
2619
2651
  ? FullPageLayout
2652
+ : selectedLayout === 'WEBSITE_ASSISTANT'
2653
+ ? WebsiteAssistantLayout
2620
2654
  : FullPageLayout;
2621
2655
 
2622
2656
  return (
@@ -0,0 +1,31 @@
1
+ import { render } from '@testing-library/react';
2
+ import Memori from '../MemoriWidget/MemoriWidget';
3
+ import { integration, memori, tenant } from '../../mocks/data';
4
+
5
+ Object.defineProperty(window, 'matchMedia', {
6
+ writable: true,
7
+ value: jest.fn().mockImplementation(query => ({
8
+ matches: false,
9
+ media: query,
10
+ onchange: null,
11
+ addListener: jest.fn(), // Deprecated
12
+ removeListener: jest.fn(), // Deprecated
13
+ addEventListener: jest.fn(),
14
+ removeEventListener: jest.fn(),
15
+ dispatchEvent: jest.fn(),
16
+ })),
17
+ });
18
+
19
+ it('renders WEBSITE_ASSISTANT layout unchanged', () => {
20
+ const { container } = render(
21
+ <Memori
22
+ showShare={true}
23
+ showSettings={true}
24
+ memori={memori}
25
+ tenant={tenant}
26
+ integration={integration}
27
+ layout="WEBSITE_ASSISTANT"
28
+ />
29
+ );
30
+ expect(container).toMatchSnapshot();
31
+ });
@@ -0,0 +1,124 @@
1
+ import React, { useState } from 'react';
2
+ import Spin from '../ui/Spin';
3
+ import { LayoutProps } from '../MemoriWidget/MemoriWidget';
4
+ import Button from '../ui/Button';
5
+ import Blob from '../Blob/Blob';
6
+ import Close from '../icons/Close';
7
+ import { useTranslation } from 'react-i18next';
8
+
9
+ const WebsiteAssistantLayout: React.FC<LayoutProps> = ({
10
+ Header,
11
+ headerProps,
12
+ Avatar,
13
+ avatarProps,
14
+ Chat,
15
+ chatProps,
16
+ StartPanel,
17
+ startPanelProps,
18
+ integrationStyle,
19
+ ChangeMode,
20
+ changeModeProps,
21
+ sessionId,
22
+ hasUserActivatedSpeak,
23
+ showInstruct = false,
24
+ loading = false,
25
+ poweredBy,
26
+ }) => {
27
+ const { t } = useTranslation();
28
+ const [collapsed, _setCollapsed] = useState(true);
29
+ const [expandedKey, setExpandedKey] = useState<string>();
30
+ const setCollapsed = (collapsed: boolean) => {
31
+ _setCollapsed(collapsed);
32
+ setExpandedKey(collapsed ? undefined : new Date().toISOString());
33
+ };
34
+
35
+ return (
36
+ <div
37
+ className={`memori-website_assistant--${
38
+ collapsed ? 'collapsed' : 'expanded'
39
+ }`}
40
+ >
41
+ {collapsed ? (
42
+ <div className="memori-website_assistant--trigger">
43
+ <Button
44
+ className="memori-website_assistant--trigger-button"
45
+ ghost
46
+ shape="circle"
47
+ onClick={() => setCollapsed(false)}
48
+ title={t('expand') || 'Expand'}
49
+ >
50
+ <Blob avatar={avatarProps?.memori.avatarURL} />
51
+ </Button>
52
+ </div>
53
+ ) : (
54
+ <>
55
+ {integrationStyle}
56
+
57
+ <Spin spinning={loading} className="memori-website_assistant-layout">
58
+ {poweredBy}
59
+
60
+ <div className="memori-website_assistant--close-button-wrapper">
61
+ <Button
62
+ className="memori-website_assistant--close-button"
63
+ primary
64
+ shape="circle"
65
+ onClick={() => setCollapsed(true)}
66
+ icon={<Close />}
67
+ title={t('close') || 'Close'}
68
+ />
69
+ </div>
70
+
71
+ {showInstruct && ChangeMode && changeModeProps && (
72
+ <ChangeMode {...changeModeProps} />
73
+ )}
74
+
75
+ <div className="memori-website_assistant-layout--header">
76
+ {Header && headerProps && (
77
+ <Header
78
+ {...headerProps}
79
+ showSettings={false}
80
+ showReload={false}
81
+ />
82
+ )}
83
+ </div>
84
+
85
+ <div className="memori-website_assistant-layout--avatar">
86
+ {Avatar && avatarProps && (
87
+ <Avatar
88
+ {...avatarProps}
89
+ integrationConfig={
90
+ avatarProps.integrationConfig
91
+ ? {
92
+ ...avatarProps.integrationConfig,
93
+ avatarURL: avatarProps.integrationConfig?.avatarURL
94
+ ? `${
95
+ avatarProps.integrationConfig?.avatarURL.split(
96
+ '#'
97
+ )[0]
98
+ }#${expandedKey}`
99
+ : undefined,
100
+ }
101
+ : {}
102
+ }
103
+ key={expandedKey}
104
+ />
105
+ )}
106
+ </div>
107
+
108
+ <div id="extension" />
109
+
110
+ <div className="memori-website_assistant-layout--controls">
111
+ {sessionId && hasUserActivatedSpeak && Chat && chatProps ? (
112
+ <Chat {...chatProps} />
113
+ ) : startPanelProps ? (
114
+ <StartPanel {...startPanelProps} />
115
+ ) : null}
116
+ </div>
117
+ </Spin>
118
+ </>
119
+ )}
120
+ </div>
121
+ );
122
+ };
123
+
124
+ export default WebsiteAssistantLayout;
@@ -0,0 +1,60 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`renders WEBSITE_ASSISTANT layout unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ class="memori memori-widget memori-layout-website_assistant memori-controls-bottom memori--with-integration"
7
+ data-memori-engine-state="{}"
8
+ data-memori-id="66b4e161-2431-4b21-9b70-d8c27de730ca"
9
+ data-memori-integration="cb3c4776-7f0b-4f97-a773-c32a5d7a3bf1"
10
+ data-memori-name="Memori"
11
+ data-memori-secondary-id="25ced51c-3520-41af-8bbe-222d861b8e32"
12
+ style="height: 100vh;"
13
+ >
14
+ <div
15
+ class="memori-website_assistant--collapsed"
16
+ >
17
+ <div
18
+ class="memori-website_assistant--trigger"
19
+ >
20
+ <button
21
+ class="memori-button memori-button--ghost memori-button--circle memori-button--padded memori-website_assistant--trigger-button"
22
+ title="expand"
23
+ >
24
+ <div
25
+ class="memori-blob"
26
+ >
27
+ <figure>
28
+ <img
29
+ alt=""
30
+ role="presentation"
31
+ src="https://app.twincreator.com/images/twincreator/square_logo.png"
32
+ />
33
+ </figure>
34
+ <div
35
+ class="mainDiv"
36
+ />
37
+ <div
38
+ class="mainDiv"
39
+ />
40
+ <div
41
+ class="mainDiv"
42
+ />
43
+ <div
44
+ class="mainDiv"
45
+ />
46
+ <div
47
+ class="mainDiv"
48
+ />
49
+ </div>
50
+ </button>
51
+ </div>
52
+ </div>
53
+ <audio
54
+ id="memori-audio"
55
+ src="https://app.twincreator.com/intro.mp3"
56
+ style="display: none;"
57
+ />
58
+ </div>
59
+ </div>
60
+ `;
@@ -84,11 +84,11 @@
84
84
  }
85
85
 
86
86
  @media (max-width: 480px) {
87
- .memori-send-on-enter-menu {
87
+ .memori-chat-layout .memori-send-on-enter-menu {
88
88
  display: none;
89
89
  }
90
90
 
91
- .memori-header--button-settings {
91
+ .memori-chat-layout .memori-header--button-settings {
92
92
  display: none;
93
93
  }
94
94
  }
@@ -312,3 +312,112 @@ Custom.args = {
312
312
  layout: 'FULLPAGE',
313
313
  customLayout: CustomLayout,
314
314
  };
315
+
316
+ export const WebsiteAssistant = Template.bind({});
317
+ WebsiteAssistant.args = {
318
+ uiLang: 'it',
319
+ showShare: true,
320
+ showSettings: true,
321
+ memori: {
322
+ memoriID: '6573844d-a7cd-47ef-9e78-840d82020c21',
323
+ name: 'Nicola',
324
+ password: null,
325
+ recoveryTokens: null,
326
+ newPassword: null,
327
+ ownerUserID: null,
328
+ ownerUserName: 'nzambello',
329
+ ownerTenantName: 'app.memorytwin.com',
330
+ memoriConfigurationID: 'fd10bb42-98d9-4c08-8e02-2b08bd4e4975',
331
+ description:
332
+ 'Sono Nicola Zambello, sviluppatore e attivista per un web etico e sostenibile',
333
+ completionDescription: null,
334
+ engineMemoriID: '9b0a2913-d3d8-4e98-a49d-6e1c99479e1b',
335
+ isOwner: false,
336
+ isGiver: false,
337
+ isReceiver: false,
338
+ giverTag: null,
339
+ giverPIN: null,
340
+ privacyType: 'PUBLIC',
341
+ secretToken: null,
342
+ minimumNumberOfRecoveryTokens: null,
343
+ totalNumberOfRecoveryTokens: null,
344
+ sentInvitations: [],
345
+ receivedInvitations: [],
346
+ integrations: [
347
+ {
348
+ integrationID: '62de8c99-0ac2-4cbe-bd95-a39ad7dc6b32',
349
+ memoriID: '6573844d-a7cd-47ef-9e78-840d82020c21',
350
+ type: 'LANDING_EXPERIENCE',
351
+ state: 'NEW',
352
+ deviceEmails: null,
353
+ invocationText: null,
354
+ jobID: null,
355
+ customData:
356
+ '{"textColor":"#000000","buttonBgColor":"#007eb6","buttonTextColor":"#ffffff","globalBackground":"https://assets.memori.ai/api/v2/asset/cade3b9c-0437-4342-b2bd-8db9c2a3a20e.png","blurBackground":true,"innerBgColor":"light","multilanguage":true,"avatar":"readyplayerme","avatarURL":"https://assets.memori.ai/api/v2/asset/893c41df-7619-436d-9e86-fe1d406fc933.glb#1681736752156","name":"Pagina pubblica","contextVars":"ANIMALE:CANE","personTag":"☠️","personPIN":"666666","personName":"Pirata","showShare":true,"avatarFullBodyURL":"https://models.readyplayer.me/63b55751f17e295642bf07a2.glb"}',
357
+ resources: [],
358
+ publish: true,
359
+ creationTimestamp: '2022-06-13T14:44:52.833573Z',
360
+ lastChangeTimestamp: '2022-06-13T14:44:52.833573Z',
361
+ },
362
+ ],
363
+ avatarURL:
364
+ 'https://assets.memori.ai/api/v2/asset/3049582f-db5f-452c-913d-e4340d4afd0a.png',
365
+ coverURL:
366
+ 'https://assets.memori.ai/api/v2/asset/e9bb9f6d-8f34-45ab-af9e-6d630d9a51a8.png',
367
+ avatar3DURL:
368
+ 'https://assets.memori.ai/api/v2/asset/893c41df-7619-436d-9e86-fe1d406fc933.glb',
369
+ avatarOriginal3DURL:
370
+ 'https://d1a370nemizbjq.cloudfront.net/c7c80a1d-deda-4fe1-96c6-fabad0771aa2.glb',
371
+ needsPosition: false,
372
+ voiceType: 'MALE',
373
+ culture: 'it-IT',
374
+ categories: [
375
+ 'biografico',
376
+ 'tecnologia',
377
+ 'web',
378
+ 'open-source',
379
+ 'green',
380
+ 'privacy',
381
+ ],
382
+ exposed: true,
383
+ disableR2R3Loop: null,
384
+ disableR4Loop: null,
385
+ disableR5Loop: null,
386
+ enableCompletions: true,
387
+ completionModel: null,
388
+ chainingMemoriID: null,
389
+ chainingBaseURL: null,
390
+ chainingPassword: null,
391
+ contentQualityIndex: 210.8,
392
+ contentQualityIndexTimestamp: '2023-04-17T00:01:32.194744Z',
393
+ publishedInTheMetaverse: true,
394
+ metaverseEnvironment: 'apartment',
395
+ blockedUntil: null,
396
+ creationTimestamp: '2022-06-13T14:21:55.793034Z',
397
+ lastChangeTimestamp: '2023-04-15T08:15:36.403546Z',
398
+ },
399
+ integration: {
400
+ integrationID: '62de8c99-0ac2-4cbe-bd95-a39ad7dc6b32',
401
+ memoriID: '6573844d-a7cd-47ef-9e78-840d82020c21',
402
+ type: 'LANDING_EXPERIENCE',
403
+ state: 'NEW',
404
+ deviceEmails: null,
405
+ invocationText: null,
406
+ jobID: null,
407
+ publish: true,
408
+ creationTimestamp: '2022-06-13T14:44:52.833573Z',
409
+ lastChangeTimestamp: '2022-06-13T14:44:52.833573Z',
410
+ customData: JSON.stringify({
411
+ ...JSON.parse(
412
+ '{"textColor":"#000000","buttonBgColor":"#007eb6","buttonTextColor":"#ffffff","globalBackground":"https://assets.memori.ai/api/v2/asset/cade3b9c-0437-4342-b2bd-8db9c2a3a20e.png","blurBackground":true,"innerBgColor":"light","multilanguage":true,"avatar":"readyplayerme","avatarURL":"https://assets.memori.ai/api/v2/asset/893c41df-7619-436d-9e86-fe1d406fc933.glb#1681736752156","name":"Pagina pubblica","contextVars":"ANIMALE:CANE","personTag":"☠️","personPIN":"666666","personName":"Pirata","showShare":true,"avatarFullBodyURL":"https://models.readyplayer.me/63b55751f17e295642bf07a2.glb"}'
413
+ ),
414
+ avatar: 'readyplayerme-full',
415
+ avatarURL:
416
+ 'https://models.readyplayer.me/63b55751f17e295642bf07a2.glb#' +
417
+ // 'https://models.readyplayer.me/63b558263858282637c54115.glb#' +
418
+ new Date(Date.now()).getTime(),
419
+ }),
420
+ },
421
+ tenant,
422
+ layout: 'WEBSITE_ASSISTANT',
423
+ };
@@ -124,11 +124,11 @@
124
124
  }
125
125
 
126
126
  @media (max-width: 480px) {
127
- .memori-send-on-enter-menu {
127
+ .memori-totem-layou .memori-send-on-enter-menu {
128
128
  display: none;
129
129
  }
130
130
 
131
- .memori-header--button-settings {
131
+ .memori-totem-layou .memori-header--button-settings {
132
132
  display: none;
133
133
  }
134
134
  }