@memori.ai/memori-react 7.21.1 → 7.23.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 (106) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.css +33 -23
  3. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +85 -8
  4. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  5. package/dist/components/KnownFacts/KnownFacts.js +1 -1
  6. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  7. package/dist/components/StartPanel/StartPanel.css +29 -0
  8. package/dist/components/StartPanel/StartPanel.js +2 -1
  9. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  10. package/dist/components/Typing/Typing.js +49 -47
  11. package/dist/components/Typing/Typing.js.map +1 -1
  12. package/dist/components/UploadButton/UploadButton.d.ts +1 -0
  13. package/dist/components/UploadButton/UploadButton.js +142 -3
  14. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  15. package/dist/components/icons/Alert.d.ts +5 -0
  16. package/dist/components/icons/Alert.js +6 -0
  17. package/dist/components/icons/Alert.js.map +1 -0
  18. package/dist/components/icons/Info.d.ts +5 -0
  19. package/dist/components/icons/Info.js +6 -0
  20. package/dist/components/icons/Info.js.map +1 -0
  21. package/dist/components/icons/Warning.js +1 -1
  22. package/dist/components/icons/Warning.js.map +1 -1
  23. package/dist/components/ui/ConfirmDialog.css +42 -0
  24. package/dist/components/ui/ConfirmDialog.d.ts +11 -0
  25. package/dist/components/ui/ConfirmDialog.js +12 -0
  26. package/dist/components/ui/ConfirmDialog.js.map +1 -0
  27. package/dist/components/ui/Drawer.css +121 -96
  28. package/dist/components/ui/Drawer.d.ts +15 -6
  29. package/dist/components/ui/Drawer.js +44 -13
  30. package/dist/components/ui/Drawer.js.map +1 -1
  31. package/dist/locales/de.json +15 -0
  32. package/dist/locales/en.json +15 -0
  33. package/dist/locales/es.json +15 -0
  34. package/dist/locales/fr.json +7 -0
  35. package/dist/locales/it.json +15 -0
  36. package/dist/styles.css +6 -4
  37. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.css +33 -23
  38. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +85 -8
  39. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  40. package/esm/components/KnownFacts/KnownFacts.js +1 -1
  41. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  42. package/esm/components/StartPanel/StartPanel.css +29 -0
  43. package/esm/components/StartPanel/StartPanel.js +2 -1
  44. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  45. package/esm/components/Typing/Typing.js +49 -47
  46. package/esm/components/Typing/Typing.js.map +1 -1
  47. package/esm/components/UploadButton/UploadButton.d.ts +1 -0
  48. package/esm/components/UploadButton/UploadButton.js +142 -3
  49. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  50. package/esm/components/icons/Alert.d.ts +5 -0
  51. package/esm/components/icons/Alert.js +4 -0
  52. package/esm/components/icons/Alert.js.map +1 -0
  53. package/esm/components/icons/Info.d.ts +5 -0
  54. package/esm/components/icons/Info.js +4 -0
  55. package/esm/components/icons/Info.js.map +1 -0
  56. package/esm/components/icons/Warning.js +1 -1
  57. package/esm/components/icons/Warning.js.map +1 -1
  58. package/esm/components/ui/ConfirmDialog.css +42 -0
  59. package/esm/components/ui/ConfirmDialog.d.ts +11 -0
  60. package/esm/components/ui/ConfirmDialog.js +9 -0
  61. package/esm/components/ui/ConfirmDialog.js.map +1 -0
  62. package/esm/components/ui/Drawer.css +121 -96
  63. package/esm/components/ui/Drawer.d.ts +15 -6
  64. package/esm/components/ui/Drawer.js +45 -14
  65. package/esm/components/ui/Drawer.js.map +1 -1
  66. package/esm/locales/de.json +15 -0
  67. package/esm/locales/en.json +15 -0
  68. package/esm/locales/es.json +15 -0
  69. package/esm/locales/fr.json +7 -0
  70. package/esm/locales/it.json +15 -0
  71. package/esm/styles.css +6 -4
  72. package/package.json +1 -1
  73. package/src/components/BlockedMemoriBadge/__snapshots__/BlockedMemoriBadge.test.tsx.snap +10 -0
  74. package/src/components/CompletionProviderStatus/CompletionProviderStatus.css +33 -23
  75. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +274 -21
  76. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +117 -21
  77. package/src/components/CompletionProviderStatus/__snapshots__/CompletionProviderStatus.test.tsx.snap +39 -21
  78. package/src/components/KnownFacts/KnownFacts.tsx +1 -1
  79. package/src/components/StartPanel/StartPanel.css +29 -0
  80. package/src/components/StartPanel/StartPanel.tsx +47 -0
  81. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +827 -7
  82. package/src/components/Typing/Typing.tsx +52 -47
  83. package/src/components/UploadButton/UploadButton.tsx +206 -5
  84. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +1 -1
  85. package/src/components/icons/Alert.tsx +31 -0
  86. package/src/components/icons/Info.tsx +31 -0
  87. package/src/components/icons/Warning.tsx +2 -1
  88. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +74 -0
  89. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +148 -0
  90. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +74 -0
  91. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +74 -0
  92. package/src/components/ui/ConfirmDialog.css +42 -0
  93. package/src/components/ui/ConfirmDialog.stories.tsx +216 -0
  94. package/src/components/ui/ConfirmDialog.test.tsx +124 -0
  95. package/src/components/ui/ConfirmDialog.tsx +58 -0
  96. package/src/components/ui/Drawer.css +121 -96
  97. package/src/components/ui/Drawer.stories.tsx +152 -67
  98. package/src/components/ui/Drawer.test.tsx +6 -2
  99. package/src/components/ui/Drawer.tsx +195 -89
  100. package/src/components/ui/__snapshots__/ConfirmDialog.test.tsx.snap +35 -0
  101. package/src/locales/de.json +15 -0
  102. package/src/locales/en.json +15 -0
  103. package/src/locales/es.json +15 -0
  104. package/src/locales/fr.json +7 -0
  105. package/src/locales/it.json +15 -0
  106. package/src/styles.css +6 -4
@@ -1,6 +1,8 @@
1
1
  import { useEffect, useState, useCallback } from 'react';
2
2
  import Tooltip from '../ui/Tooltip';
3
3
  import Warning from '../icons/Warning';
4
+ import Alert from '../icons/Alert';
5
+ import Info from '../icons/Info';
4
6
  import { useTranslation } from 'react-i18next';
5
7
  import Spin from '../ui/Spin';
6
8
 
@@ -19,40 +21,98 @@ export interface Props {
19
21
  interface ProviderConfig {
20
22
  statusUrl: string;
21
23
  statusPage: string;
24
+ apiComponentName?: string | string[]; // Component name(s) to look for
22
25
  }
23
26
 
24
27
  const PROVIDER_CONFIGS: Record<string, ProviderConfig> = {
25
28
  OpenAI: {
26
29
  statusUrl: 'https://status.openai.com/api/v2/summary.json',
27
30
  statusPage: 'https://status.openai.com/',
31
+ apiComponentName: ['Chat', 'Completions (legacy)'],
28
32
  },
29
33
  Mistral: {
30
34
  statusUrl: 'https://status.mistral-data.com/api/v2/summary.json',
31
35
  statusPage: 'https://status.mistral-data.com/',
36
+ apiComponentName: ['Mistral'],
32
37
  },
33
38
  Anthropic: {
34
- statusUrl: 'https://status.anthropic.com/api/v2/summary.json',
39
+ statusUrl: 'https://status.anthropic.com/api/v2/summary.json',
35
40
  statusPage: 'https://status.anthropic.com/',
41
+ apiComponentName: ['api.anthropic.com'],
36
42
  },
37
43
  };
38
44
 
39
- // Modified to handle fetch errors and use cross-fetch
40
- const fetchProviderStatus = async (statusUrl: string): Promise<Status> => {
45
+ // Modified to handle fetch errors, different component names, and check incidents
46
+ const fetchProviderStatus = async (config: ProviderConfig): Promise<Status> => {
41
47
  try {
42
48
  // Use cross-fetch instead of native fetch
43
- const response = await fetch(statusUrl);
44
-
49
+ const response = await fetch(config.statusUrl);
45
50
  if (!response.ok) {
46
51
  console.warn(`Status API returned ${response.status}`);
47
52
  return 'operational'; // Fallback to operational on API errors
48
53
  }
49
-
54
+
50
55
  const data = await response.json();
51
- const apiComponent = data.components?.find(
52
- (component: { name: string }) => component.name === 'API'
53
- );
54
-
55
- return apiComponent?.status as Status ?? 'operational';
56
+
57
+ // Check for active incidents first
58
+ if (data.incidents && Array.isArray(data.incidents) && data.incidents.length > 0) {
59
+ const activeIncidents = data.incidents.filter(
60
+ (incident: { status: string }) =>
61
+ !['resolved', 'completed', 'postmortem'].includes(incident.status.toLowerCase())
62
+ );
63
+
64
+ if (activeIncidents.length > 0) {
65
+ // If there are active incidents, determine the severity
66
+ const critical = activeIncidents.some((i: { impact: string }) =>
67
+ i.impact === 'critical' || i.impact === 'major'
68
+ );
69
+ const major = activeIncidents.some((i: { impact: string }) =>
70
+ i.impact === 'moderate'
71
+ );
72
+
73
+ if (critical) return 'major_outage';
74
+ if (major) return 'partial_outage';
75
+ return 'degraded_performance';
76
+ }
77
+ }
78
+
79
+ // If no incidents or they're all resolved, check specific API components
80
+ if (data.components) {
81
+ // First try with primary API component names
82
+ if (config.apiComponentName) {
83
+ const apiComponentNames = Array.isArray(config.apiComponentName)
84
+ ? config.apiComponentName
85
+ : [config.apiComponentName];
86
+
87
+ for (const name of apiComponentNames) {
88
+ const apiComponent = data.components.find(
89
+ (component: { name: string }) => component.name === name
90
+ );
91
+
92
+ if (apiComponent && apiComponent.status !== 'operational') {
93
+ return apiComponent.status as Status;
94
+ }
95
+ }
96
+ }
97
+
98
+ // Check if any component is degraded (might indicate API issues)
99
+ const anyDegradedComponent = data.components.some(
100
+ (component: { status: string }) => component.status !== 'operational'
101
+ );
102
+
103
+ if (anyDegradedComponent) {
104
+ return 'degraded_performance';
105
+ }
106
+ }
107
+
108
+ // If no specific component issues found, check overall status
109
+ if (data.status && data.status.indicator !== 'none') {
110
+ if (data.status.indicator === 'critical') return 'major_outage';
111
+ if (data.status.indicator === 'major') return 'partial_outage';
112
+ if (data.status.indicator === 'minor') return 'degraded_performance';
113
+ }
114
+
115
+ return 'operational'; // Default to operational if no issues detected
56
116
  } catch (error) {
57
117
  console.error('Error fetching provider status:', error);
58
118
  return 'operational'; // Fallback to operational on network errors
@@ -66,12 +126,11 @@ const CompletionProviderStatus = ({
66
126
  const { t } = useTranslation();
67
127
  const [status, setStatus] = useState<Status>(forceStatus ?? 'operational');
68
128
  const [isLoading, setIsLoading] = useState(false);
69
-
70
129
  const config = PROVIDER_CONFIGS[provider];
71
130
 
72
131
  const getStatus = useCallback(async () => {
73
132
  if (!config) return 'operational';
74
- return fetchProviderStatus(config.statusUrl);
133
+ return fetchProviderStatus(config);
75
134
  }, [config]);
76
135
 
77
136
  useEffect(() => {
@@ -80,7 +139,6 @@ const CompletionProviderStatus = ({
80
139
 
81
140
  const checkStatus = async () => {
82
141
  if (forceStatus) return;
83
-
84
142
  setIsLoading(true);
85
143
  try {
86
144
  const newStatus = await getStatus();
@@ -119,17 +177,55 @@ const CompletionProviderStatus = ({
119
177
  return null;
120
178
  }
121
179
 
180
+ // Get appropriate icon and message based on status severity
181
+ const getStatusDetails = () => {
182
+ switch (status) {
183
+ case 'major_outage':
184
+ return {
185
+ Icon: Alert,
186
+ message: t('completionProviderMajorOutage', {
187
+ provider: provider ?? t('completionProviderFallbackName'),
188
+ fallback: t('completionProviderDown', {
189
+ provider: provider ?? t('completionProviderFallbackName'),
190
+ })
191
+ }),
192
+ className: "memori--completion-provider-status--icon-error"
193
+ };
194
+ case 'partial_outage':
195
+ return {
196
+ Icon: Warning,
197
+ message: t('completionProviderPartialOutage', {
198
+ provider: provider ?? t('completionProviderFallbackName'),
199
+ fallback: t('completionProviderDown', {
200
+ provider: provider ?? t('completionProviderFallbackName'),
201
+ })
202
+ }),
203
+ className: "memori--completion-provider-status--icon-warning"
204
+ };
205
+ case 'degraded_performance':
206
+ default:
207
+ return {
208
+ Icon: Info,
209
+ message: t('completionProviderDegraded', {
210
+ provider: provider ?? t('completionProviderFallbackName'),
211
+ fallback: t('completionProviderDown', {
212
+ provider: provider ?? t('completionProviderFallbackName'),
213
+ })
214
+ }),
215
+ className: "memori--completion-provider-status--icon-info"
216
+ };
217
+ }
218
+ };
219
+
220
+ const { Icon, message, className } = getStatusDetails();
221
+
122
222
  return (
123
223
  <Tooltip
124
224
  className="memori--completion-provider-status--tooltip"
125
- align="topLeft"
225
+ align="right"
126
226
  content={
127
227
  <div>
128
- <p>
129
- {t('completionProviderDown', {
130
- provider: provider ?? t('completionProviderFallbackName'),
131
- })}
132
- </p>
228
+ <p>{message}</p>
133
229
  {config?.statusPage && (
134
230
  <p>
135
231
  <a
@@ -144,7 +240,7 @@ const CompletionProviderStatus = ({
144
240
  </div>
145
241
  }
146
242
  >
147
- <Warning className="memori--completion-provider-status--icon" />
243
+ <Icon className={`memori--completion-provider-status--icon ${className}`} />
148
244
  </Tooltip>
149
245
  );
150
246
  };
@@ -3,14 +3,14 @@
3
3
  exports[`renders CompletionProviderStatus errored unchanged 1`] = `
4
4
  <div>
5
5
  <div
6
- class="memori-tooltip memori-tooltip--align-topLeft memori--completion-provider-status--tooltip"
6
+ class="memori-tooltip memori-tooltip--align-right memori--completion-provider-status--tooltip"
7
7
  >
8
8
  <div
9
9
  class="memori-tooltip--content"
10
10
  >
11
11
  <div>
12
12
  <p>
13
- completionProviderDown
13
+ completionProviderMajorOutage
14
14
  </p>
15
15
  <p>
16
16
  <a
@@ -28,14 +28,20 @@ exports[`renders CompletionProviderStatus errored unchanged 1`] = `
28
28
  >
29
29
  <svg
30
30
  aria-hidden="true"
31
- class="memori--completion-provider-status--icon"
32
- focusable="false"
33
- role="img"
34
- viewBox="0 0 1024 1024"
31
+ class="memori--completion-provider-status--icon memori--completion-provider-status--icon-error"
32
+ color="currentColor"
33
+ fill="none"
34
+ height="800px"
35
+ viewBox="0 0 24 24"
36
+ width="800px"
35
37
  xmlns="http://www.w3.org/2000/svg"
36
38
  >
37
39
  <path
38
- 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"
40
+ d="M12 16H12.01M12 8V12M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z"
41
+ stroke="currentColor"
42
+ stroke-linecap="round"
43
+ stroke-linejoin="round"
44
+ stroke-width="2"
39
45
  />
40
46
  </svg>
41
47
  </div>
@@ -46,14 +52,14 @@ exports[`renders CompletionProviderStatus errored unchanged 1`] = `
46
52
  exports[`renders CompletionProviderStatus errored with provider specified unchanged 1`] = `
47
53
  <div>
48
54
  <div
49
- class="memori-tooltip memori-tooltip--align-topLeft memori--completion-provider-status--tooltip"
55
+ class="memori-tooltip memori-tooltip--align-right memori--completion-provider-status--tooltip"
50
56
  >
51
57
  <div
52
58
  class="memori-tooltip--content"
53
59
  >
54
60
  <div>
55
61
  <p>
56
- completionProviderDown
62
+ completionProviderMajorOutage
57
63
  </p>
58
64
  <p>
59
65
  <a
@@ -71,14 +77,20 @@ exports[`renders CompletionProviderStatus errored with provider specified unchan
71
77
  >
72
78
  <svg
73
79
  aria-hidden="true"
74
- class="memori--completion-provider-status--icon"
75
- focusable="false"
76
- role="img"
77
- viewBox="0 0 1024 1024"
80
+ class="memori--completion-provider-status--icon memori--completion-provider-status--icon-error"
81
+ color="currentColor"
82
+ fill="none"
83
+ height="800px"
84
+ viewBox="0 0 24 24"
85
+ width="800px"
78
86
  xmlns="http://www.w3.org/2000/svg"
79
87
  >
80
88
  <path
81
- 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"
89
+ d="M12 16H12.01M12 8V12M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z"
90
+ stroke="currentColor"
91
+ stroke-linecap="round"
92
+ stroke-linejoin="round"
93
+ stroke-width="2"
82
94
  />
83
95
  </svg>
84
96
  </div>
@@ -89,14 +101,14 @@ exports[`renders CompletionProviderStatus errored with provider specified unchan
89
101
  exports[`renders CompletionProviderStatus unchanged 1`] = `
90
102
  <div>
91
103
  <div
92
- class="memori-tooltip memori-tooltip--align-topLeft memori--completion-provider-status--tooltip"
104
+ class="memori-tooltip memori-tooltip--align-right memori--completion-provider-status--tooltip"
93
105
  >
94
106
  <div
95
107
  class="memori-tooltip--content"
96
108
  >
97
109
  <div>
98
110
  <p>
99
- completionProviderDown
111
+ completionProviderMajorOutage
100
112
  </p>
101
113
  <p>
102
114
  <a
@@ -114,14 +126,20 @@ exports[`renders CompletionProviderStatus unchanged 1`] = `
114
126
  >
115
127
  <svg
116
128
  aria-hidden="true"
117
- class="memori--completion-provider-status--icon"
118
- focusable="false"
119
- role="img"
120
- viewBox="0 0 1024 1024"
129
+ class="memori--completion-provider-status--icon memori--completion-provider-status--icon-error"
130
+ color="currentColor"
131
+ fill="none"
132
+ height="800px"
133
+ viewBox="0 0 24 24"
134
+ width="800px"
121
135
  xmlns="http://www.w3.org/2000/svg"
122
136
  >
123
137
  <path
124
- 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"
138
+ d="M12 16H12.01M12 8V12M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z"
139
+ stroke="currentColor"
140
+ stroke-linecap="round"
141
+ stroke-linejoin="round"
142
+ stroke-width="2"
125
143
  />
126
144
  </svg>
127
145
  </div>
@@ -60,7 +60,7 @@ const KnownFacts = ({
60
60
  howMany ?? numberOfResults
61
61
  );
62
62
 
63
- setKnownFacts(knownFacts ?? []);
63
+ setKnownFacts(knownFacts ?? initialKnownFacts);
64
64
  setKnownFactsCount(count ?? 0);
65
65
 
66
66
  if (response.resultCode !== 0) {
@@ -218,3 +218,32 @@
218
218
  color: inherit;
219
219
  text-decoration: underline;
220
220
  }
221
+
222
+ .memori--start-privacy-explanation-container {
223
+ display: flex;
224
+ align-items: center;
225
+ justify-content: flex-start;
226
+ }
227
+
228
+ .memori--start-privacy-explanation {
229
+ color: var(--memori-text-color, rgba(0, 0, 0, 0.85));
230
+ font-size: 0.85em;
231
+ font-style: italic;
232
+ opacity: 0.85;
233
+ }
234
+
235
+ .memori--start-privacy-explanation-icon {
236
+ display: flex;
237
+ width: 1.2rem;
238
+ height: 1.2rem;
239
+ align-self: center;
240
+ margin-left: 0.5rem;
241
+ }
242
+
243
+ .memori--privacy-tooltip-content {
244
+ text-align: left;
245
+ }
246
+
247
+ .memori--privacy-tooltip-content-list {
248
+ padding-left: 1rem;
249
+ }
@@ -20,6 +20,7 @@ import CompletionProviderStatus, {
20
20
  Props as CPSProps,
21
21
  } from '../CompletionProviderStatus/CompletionProviderStatus';
22
22
  import MapMarker from '../icons/MapMarker';
23
+ import QuestionHelp from '../icons/QuestionHelp';
23
24
 
24
25
  export interface Props {
25
26
  memori: Memori;
@@ -245,6 +246,52 @@ const StartPanel: React.FC<Props> = ({
245
246
  </div>
246
247
  )}
247
248
 
249
+ <div className="memori--start-privacy-explanation-container">
250
+ <p className="memori--start-privacy-explanation">
251
+ {t('write_and_speak.pagePrivacyExplanation')}
252
+ </p>
253
+ <Tooltip
254
+ align="right"
255
+ content={
256
+ <div className="memori--privacy-tooltip-content">
257
+ <p>
258
+ {' '}
259
+ {t(
260
+ 'write_and_speak.pagePrivacyExplanationList.allConversations'
261
+ )}
262
+ </p>
263
+ <ul className="memori--privacy-tooltip-content-list">
264
+ <li>
265
+ {t(
266
+ 'write_and_speak.pagePrivacyExplanationList.anonymousUser'
267
+ )}
268
+ </li>
269
+ <li>
270
+ {t(
271
+ 'write_and_speak.pagePrivacyExplanationList.registeredUser'
272
+ )}
273
+ </li>
274
+ </ul>
275
+ <p>
276
+ {t(
277
+ 'write_and_speak.pagePrivacyExplanationList.authorUsesInfo'
278
+ )}
279
+ </p>
280
+
281
+ <a
282
+ href={'https://memori.ai/en/privacy-policy'}
283
+ target="_blank"
284
+ rel="noopener noreferrer"
285
+ >
286
+ {t('privacyPolicy')}
287
+ </a>
288
+ </div>
289
+ }
290
+ >
291
+ <QuestionHelp className="memori--start-privacy-explanation-icon" />
292
+ </Tooltip>
293
+ </div>
294
+
248
295
  <Button
249
296
  primary
250
297
  disabled={