@memori.ai/memori-react 2.19.2 → 2.20.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 (57) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.css +18 -0
  3. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.d.ts +6 -0
  4. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +44 -0
  5. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -0
  6. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.test.d.ts +1 -0
  7. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.test.js +23 -0
  8. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.test.js.map +1 -0
  9. package/dist/components/MemoriWidget/MemoriWidget.js +11 -11
  10. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  11. package/dist/components/StartPanel/StartPanel.css +4 -0
  12. package/dist/components/StartPanel/StartPanel.d.ts +1 -0
  13. package/dist/components/StartPanel/StartPanel.js +3 -2
  14. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  15. package/dist/components/StartPanel/StartPanel.test.js +7 -0
  16. package/dist/components/StartPanel/StartPanel.test.js.map +1 -1
  17. package/dist/components/ui/Tooltip.d.ts +0 -1
  18. package/dist/components/ui/Tooltip.js.map +1 -1
  19. package/dist/locales/en.json +3 -0
  20. package/dist/locales/it.json +3 -0
  21. package/dist/styles.css +1 -0
  22. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.css +18 -0
  23. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.d.ts +6 -0
  24. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +41 -0
  25. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -0
  26. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.test.d.ts +1 -0
  27. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.test.js +20 -0
  28. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.test.js.map +1 -0
  29. package/esm/components/MemoriWidget/MemoriWidget.js +11 -11
  30. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  31. package/esm/components/StartPanel/StartPanel.css +4 -0
  32. package/esm/components/StartPanel/StartPanel.d.ts +1 -0
  33. package/esm/components/StartPanel/StartPanel.js +3 -2
  34. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  35. package/esm/components/StartPanel/StartPanel.test.js +7 -0
  36. package/esm/components/StartPanel/StartPanel.test.js.map +1 -1
  37. package/esm/components/ui/Tooltip.d.ts +0 -1
  38. package/esm/components/ui/Tooltip.js.map +1 -1
  39. package/esm/locales/en.json +3 -0
  40. package/esm/locales/it.json +3 -0
  41. package/esm/styles.css +1 -0
  42. package/package.json +1 -1
  43. package/src/components/CompletionProviderStatus/CompletionProviderStatus.css +18 -0
  44. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +38 -0
  45. package/src/components/CompletionProviderStatus/CompletionProviderStatus.test.tsx +29 -0
  46. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +75 -0
  47. package/src/components/CompletionProviderStatus/__snapshots__/CompletionProviderStatus.test.tsx.snap +82 -0
  48. package/src/components/MemoriWidget/MemoriWidget.tsx +6 -4
  49. package/src/components/StartPanel/StartPanel.css +4 -0
  50. package/src/components/StartPanel/StartPanel.stories.tsx +19 -0
  51. package/src/components/StartPanel/StartPanel.test.tsx +22 -0
  52. package/src/components/StartPanel/StartPanel.tsx +8 -0
  53. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +139 -0
  54. package/src/components/ui/Tooltip.tsx +0 -1
  55. package/src/locales/en.json +3 -0
  56. package/src/locales/it.json +3 -0
  57. package/src/styles.css +1 -0
@@ -0,0 +1,75 @@
1
+ import { useEffect, useState } from 'react';
2
+ import Tooltip from '../ui/Tooltip';
3
+ import Warning from '../icons/Warning';
4
+ import { useTranslation } from 'react-i18next';
5
+
6
+ export interface Props {
7
+ forceStatus?: string;
8
+ provider?: 'OpenAI' | string | null;
9
+ }
10
+
11
+ const initProviderStatus = (provider?: Props['provider']) => {
12
+ switch (provider) {
13
+ case 'DEFAULT':
14
+ case 'OpenAI':
15
+ return {
16
+ getStatus: async () => {
17
+ const res = await fetch(
18
+ 'https://status.openai.com/api/v2/summary.json'
19
+ );
20
+ const data = await res.json();
21
+ return data.status.indicator ?? 'none';
22
+ },
23
+ statusPage: 'https://status.openai.com/',
24
+ };
25
+ default:
26
+ return {
27
+ getStatus: async () => 'none',
28
+ statusPage: '',
29
+ };
30
+ }
31
+ };
32
+
33
+ const CompletionProviderStatus = ({ forceStatus, provider }: Props) => {
34
+ const { t } = useTranslation();
35
+ const [status, setStatus] = useState(forceStatus ?? 'none');
36
+
37
+ const providerStatus = initProviderStatus(provider);
38
+
39
+ useEffect(() => {
40
+ if (forceStatus) return;
41
+
42
+ providerStatus.getStatus().then(status => setStatus(status));
43
+ }, [forceStatus, provider]);
44
+
45
+ return status !== 'none' ? (
46
+ <Tooltip
47
+ className="memori--completion-provider-status--tooltip"
48
+ align="topLeft"
49
+ content={
50
+ <div>
51
+ <p>
52
+ {t('completionProviderDown', {
53
+ provider: provider ?? t('completionProviderFallbackName'),
54
+ })}
55
+ </p>
56
+ {!!providerStatus.statusPage?.length && (
57
+ <p>
58
+ <a
59
+ href={providerStatus.statusPage}
60
+ rel="noopener noreferrer"
61
+ target="_blank"
62
+ >
63
+ {t('completionProviderCheckStatusPage')}
64
+ </a>
65
+ </p>
66
+ )}
67
+ </div>
68
+ }
69
+ >
70
+ <Warning className="memori--completion-provider-status--icon" />
71
+ </Tooltip>
72
+ ) : null;
73
+ };
74
+
75
+ export default CompletionProviderStatus;
@@ -0,0 +1,82 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`renders CompletionProviderStatus errored unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ class="memori-tooltip memori-tooltip--align-topLeft memori--completion-provider-status--tooltip"
7
+ >
8
+ <div
9
+ class="memori-tooltip--content"
10
+ >
11
+ <div>
12
+ <p>
13
+ completionProviderDown
14
+ </p>
15
+ </div>
16
+ </div>
17
+ <div
18
+ class="memori-tooltip--trigger"
19
+ >
20
+ <svg
21
+ aria-hidden="true"
22
+ class="memori--completion-provider-status--icon"
23
+ focusable="false"
24
+ role="img"
25
+ viewBox="0 0 1024 1024"
26
+ xmlns="http://www.w3.org/2000/svg"
27
+ >
28
+ <path
29
+ d="M464 720a48 48 0 1096 0 48 48 0 10-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"
30
+ />
31
+ </svg>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ `;
36
+
37
+ exports[`renders CompletionProviderStatus errored with provider specified unchanged 1`] = `
38
+ <div>
39
+ <div
40
+ class="memori-tooltip memori-tooltip--align-topLeft memori--completion-provider-status--tooltip"
41
+ >
42
+ <div
43
+ class="memori-tooltip--content"
44
+ >
45
+ <div>
46
+ <p>
47
+ completionProviderDown
48
+ </p>
49
+ <p>
50
+ <a
51
+ href="https://status.openai.com/"
52
+ rel="noopener noreferrer"
53
+ target="_blank"
54
+ >
55
+ completionProviderCheckStatusPage
56
+ </a>
57
+ </p>
58
+ </div>
59
+ </div>
60
+ <div
61
+ class="memori-tooltip--trigger"
62
+ >
63
+ <svg
64
+ aria-hidden="true"
65
+ class="memori--completion-provider-status--icon"
66
+ focusable="false"
67
+ role="img"
68
+ viewBox="0 0 1024 1024"
69
+ xmlns="http://www.w3.org/2000/svg"
70
+ >
71
+ <path
72
+ d="M464 720a48 48 0 1096 0 48 48 0 10-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"
73
+ />
74
+ </svg>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ `;
79
+
80
+ exports[`renders CompletionProviderStatus unchanged 1`] = `<div />`;
81
+
82
+ exports[`renders CompletionProviderStatus with provider specified unchanged 1`] = `<div />`;
@@ -914,7 +914,7 @@ const MemoriWidget = ({
914
914
  pin: params.pin ?? personification?.pin,
915
915
  additionalInfo: {
916
916
  ...(additionalInfo || {}),
917
- loginToken: additionalInfo?.loginToken ?? authToken,
917
+ loginToken: additionalInfo?.loginToken ?? loginToken ?? authToken,
918
918
  language: getCultureCodeByLanguage(userLang),
919
919
  referral: referral,
920
920
  },
@@ -1009,7 +1009,7 @@ const MemoriWidget = ({
1009
1009
  birthDate: birthDate || storageBirthDate || undefined,
1010
1010
  additionalInfo: {
1011
1011
  ...(additionalInfo || {}),
1012
- loginToken: additionalInfo?.loginToken ?? authToken,
1012
+ loginToken: additionalInfo?.loginToken ?? loginToken ?? authToken,
1013
1013
  language: getCultureCodeByLanguage(userLang),
1014
1014
  referral: referral,
1015
1015
  },
@@ -1139,7 +1139,7 @@ const MemoriWidget = ({
1139
1139
  birthDate: birthDate || storageBirthDate || undefined,
1140
1140
  additionalInfo: {
1141
1141
  ...(additionalInfo || {}),
1142
- loginToken: additionalInfo?.loginToken ?? authToken,
1142
+ loginToken: additionalInfo?.loginToken ?? loginToken ?? authToken,
1143
1143
  language: getCultureCodeByLanguage(userLang),
1144
1144
  referral: referral,
1145
1145
  },
@@ -2506,7 +2506,9 @@ const MemoriWidget = ({
2506
2506
  [memoriPwd, memori, memoriTokens, birthDate, sessionId, userLang]
2507
2507
  );
2508
2508
 
2509
- const [loginToken, setLoginToken] = useState<string | undefined>(authToken);
2509
+ const [loginToken, setLoginToken] = useState<string | undefined>(
2510
+ additionalInfo?.loginToken ?? authToken
2511
+ );
2510
2512
  useEffect(() => {
2511
2513
  const targetNode =
2512
2514
  document.querySelector(`memori-client[memoriname="${memori.name}"]`) ||
@@ -109,6 +109,10 @@
109
109
  opacity: 0.85;
110
110
  }
111
111
 
112
+ .memori--start-button {
113
+ margin-right: 1em;
114
+ }
115
+
112
116
  .memori--language-chooser {
113
117
  margin-bottom: 1rem;
114
118
  }
@@ -237,3 +237,22 @@ WithIntegration.args = {
237
237
  clickedStart: false,
238
238
  onClickStart: () => {},
239
239
  };
240
+
241
+ export const WithCompletionProviderDown = Template.bind({});
242
+ WithCompletionProviderDown.args = {
243
+ memori: {
244
+ ...memori,
245
+ enableCompletions: false,
246
+ completionProvider: 'OpenAI',
247
+ },
248
+ tenant,
249
+ language: 'it',
250
+ userLang: 'en',
251
+ setUserLang: () => {},
252
+ openPositionDrawer: () => {},
253
+ instruct: false,
254
+ sessionId: sessionID,
255
+ clickedStart: false,
256
+ onClickStart: () => {},
257
+ _TEST_forceProviderStatus: 'major',
258
+ };
@@ -132,3 +132,25 @@ it('renders StartPanel with integrationConfig unchanged', () => {
132
132
  );
133
133
  expect(container).toMatchSnapshot();
134
134
  });
135
+
136
+ it('renders StartPanel with completion provider down unchanged', () => {
137
+ const { container } = render(
138
+ <StartPanel
139
+ memori={{
140
+ ...memori,
141
+ completionProvider: 'OpenAI',
142
+ }}
143
+ tenant={tenant}
144
+ language="it"
145
+ userLang="en"
146
+ setUserLang={() => {}}
147
+ openPositionDrawer={() => {}}
148
+ instruct={false}
149
+ sessionId={sessionID}
150
+ clickedStart={false}
151
+ onClickStart={() => {}}
152
+ _TEST_forceProviderStatus="major"
153
+ />
154
+ );
155
+ expect(container).toMatchSnapshot();
156
+ });
@@ -14,6 +14,7 @@ import Translation from '../icons/Translation';
14
14
  import { chatLanguages } from '../../helpers/constants';
15
15
  import BlockedMemoriBadge from '../BlockedMemoriBadge/BlockedMemoriBadge';
16
16
  import AI from '../icons/AI';
17
+ import CompletionProviderStatus from '../CompletionProviderStatus/CompletionProviderStatus';
17
18
 
18
19
  export interface Props {
19
20
  memori: Memori;
@@ -32,6 +33,7 @@ export interface Props {
32
33
  clickedStart?: boolean;
33
34
  onClickStart?: () => void;
34
35
  initializeTTS?: () => void;
36
+ _TEST_forceProviderStatus?: string;
35
37
  }
36
38
 
37
39
  const StartPanel: React.FC<Props> = ({
@@ -50,6 +52,7 @@ const StartPanel: React.FC<Props> = ({
50
52
  clickedStart,
51
53
  onClickStart,
52
54
  initializeTTS,
55
+ _TEST_forceProviderStatus,
53
56
  }) => {
54
57
  const { t, i18n } = useTranslation();
55
58
  const [translatedDescription, setTranslatedDescription] = useState(
@@ -254,6 +257,11 @@ const StartPanel: React.FC<Props> = ({
254
257
  )}
255
258
  </Button>
256
259
 
260
+ <CompletionProviderStatus
261
+ provider={memori.completionProvider}
262
+ forceStatus={_TEST_forceProviderStatus}
263
+ />
264
+
257
265
  <p className="memori--start-description">
258
266
  {instruct
259
267
  ? t('write_and_speak.pageInstructExplanation')
@@ -224,6 +224,145 @@ exports[`renders StartPanel unchanged 1`] = `
224
224
  </div>
225
225
  `;
226
226
 
227
+ exports[`renders StartPanel with completion provider down unchanged 1`] = `
228
+ <div>
229
+ <div
230
+ class="memori--start-panel"
231
+ >
232
+ <div
233
+ class="memori--cover"
234
+ >
235
+ <div
236
+ class="memori--completions-enabled"
237
+ >
238
+ <div
239
+ class="memori-tooltip memori-tooltip--align-left"
240
+ >
241
+ <div
242
+ class="memori-tooltip--content"
243
+ >
244
+ completionsEnabled
245
+ </div>
246
+ <div
247
+ class="memori-tooltip--trigger"
248
+ >
249
+ <span
250
+ aria-label="completionsEnabled"
251
+ >
252
+ <svg
253
+ aria-hidden="true"
254
+ fill="none"
255
+ focusable="false"
256
+ role="img"
257
+ viewBox="0 0 24 24"
258
+ xmlns="http://www.w3.org/2000/svg"
259
+ >
260
+ <g
261
+ clip-rule="evenodd"
262
+ fill="currentColor"
263
+ fill-rule="evenodd"
264
+ >
265
+ <path
266
+ clip-rule="evenodd"
267
+ d="M0 4a4 4 0 014-4h16a4 4 0 014 4v16a4 4 0 01-4 4H4a4 4 0 01-4-4zm4-2.4A2.4 2.4 0 001.6 4v16A2.4 2.4 0 004 22.4h16a2.4 2.4 0 002.4-2.4V4A2.4 2.4 0 0020 1.6z"
268
+ fill-rule="evenodd"
269
+ />
270
+ <path
271
+ clip-rule="evenodd"
272
+ d="M9.715 8.442a.798.798 0 00-1.43 0l-3.2 6.4a.799.799 0 101.431.716l.579-1.158h3.811l.578 1.158a.8.8 0 001.431-.716zm.391 4.358L9 10.589 7.894 12.8z"
273
+ fill-rule="evenodd"
274
+ />
275
+ <path
276
+ clip-rule="evenodd"
277
+ d="M17 8c.552 0 1 .358 1 .8v6.4c0 .442-.448.8-1 .8s-1-.358-1-.8V8.8c0-.442.448-.8 1-.8z"
278
+ fill-rule="evenodd"
279
+ />
280
+ </g>
281
+ </svg>
282
+ </span>
283
+ </div>
284
+ </div>
285
+ </div>
286
+ </div>
287
+ <picture
288
+ class="memori--avatar"
289
+ >
290
+ <source
291
+ src="https://app.twincreator.com/images/twincreator/square_logo.png"
292
+ />
293
+ <img
294
+ alt="Memori"
295
+ src="https://app.twincreator.com/images/twincreator/square_logo.png"
296
+ />
297
+ </picture>
298
+ <h2
299
+ class="memori--title"
300
+ >
301
+ Memori
302
+ </h2>
303
+ <div
304
+ class="memori--description"
305
+ >
306
+ <p>
307
+ <span
308
+ class="memori--description-text"
309
+ >
310
+ Lorem ipsum.
311
+ </span>
312
+ </p>
313
+ <button
314
+ class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
315
+ >
316
+ write_and_speak.tryMeButton
317
+ </button>
318
+ <div
319
+ class="memori-tooltip memori-tooltip--align-topLeft memori--completion-provider-status--tooltip"
320
+ >
321
+ <div
322
+ class="memori-tooltip--content"
323
+ >
324
+ <div>
325
+ <p>
326
+ completionProviderDown
327
+ </p>
328
+ <p>
329
+ <a
330
+ href="https://status.openai.com/"
331
+ rel="noopener noreferrer"
332
+ target="_blank"
333
+ >
334
+ completionProviderCheckStatusPage
335
+ </a>
336
+ </p>
337
+ </div>
338
+ </div>
339
+ <div
340
+ class="memori-tooltip--trigger"
341
+ >
342
+ <svg
343
+ aria-hidden="true"
344
+ class="memori--completion-provider-status--icon"
345
+ focusable="false"
346
+ role="img"
347
+ viewBox="0 0 1024 1024"
348
+ xmlns="http://www.w3.org/2000/svg"
349
+ >
350
+ <path
351
+ d="M464 720a48 48 0 1096 0 48 48 0 10-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"
352
+ />
353
+ </svg>
354
+ </div>
355
+ </div>
356
+ <p
357
+ class="memori--start-description"
358
+ >
359
+ write_and_speak.pageTryMeExplanation
360
+ </p>
361
+ </div>
362
+ </div>
363
+ </div>
364
+ `;
365
+
227
366
  exports[`renders StartPanel with completions enabled unchanged 1`] = `
228
367
  <div>
229
368
  <div
@@ -5,7 +5,6 @@ export interface Props {
5
5
  content: string | JSX.Element | React.ReactNode;
6
6
  className?: string;
7
7
  align?: 'left' | 'right' | 'topLeft' | 'topRight';
8
- alignTop?: boolean;
9
8
  disabled?: boolean;
10
9
  children: React.ReactNode;
11
10
  visible?: boolean;
@@ -31,6 +31,9 @@
31
31
  "memoriBlockedGiverHelper": "You can still manage it as administrator, but other users will not be able to interact with it.",
32
32
  "generatedByAI": "Answer generated by AI, may occasionally generate incorrect informations",
33
33
  "completionsEnabled": "Advanced AI, can respond with automatically generated answers that may sometimes contain incorrect information",
34
+ "completionProviderDown": "This Twin is integrated with a generative AI from {{provider}}, but it is currently unavailable. Try again later.",
35
+ "completionProviderFallbackName": "an external provider",
36
+ "completionProviderCheckStatusPage": "Check status page",
34
37
  "birthDate": "Birth date",
35
38
  "birthDateHelper": "We ask for your birth date only to enable or disable functionalities that have age restrictions",
36
39
  "underage": "You must be at least {{age}} years old to sign up.",
@@ -31,6 +31,9 @@
31
31
  "memoriBlockedGiverHelper": "Puoi sempre gestirlo in qualità di amministratore, ma altri utenti non potranno interrogarlo.",
32
32
  "generatedByAI": "Risposta generata da IA, può talvolta generare informazioni non corrette",
33
33
  "completionsEnabled": "IA evoluta, può rispondere con risposte generate automaticamente che talvolta potrebbero contenere informazioni non corrette",
34
+ "completionProviderDown": "Questo Twin è integrato con una IA generativa di {{provider}}, ma al momento non è disponibile. Riprova più tardi.",
35
+ "completionProviderFallbackName": "un provider esterno",
36
+ "completionProviderCheckStatusPage": "Vedi pagina di stato",
34
37
  "birthDate": "Data di nascita",
35
38
  "birthDateHelper": "Ti chiediamo la data di nascita esclusivamente per abilitare o disabilitare le funzionalità che hanno restrizioni in base all'età",
36
39
  "underage": "Devi avere almeno {{age}} anni per registrarti.",
package/src/styles.css CHANGED
@@ -7,6 +7,7 @@
7
7
  @import url('./components/ui/Tooltip.css');
8
8
  @import url('./components/ui/Select.css');
9
9
 
10
+ @import url('./components/CompletionProviderStatus/CompletionProviderStatus.css');
10
11
  @import url('./components/PoweredBy/PoweredBy.css');
11
12
  @import url('./components/AttachmentLinkModal/AttachmentLinkModal.css');
12
13
  @import url('./components/Auth/Auth.css');