@memori.ai/memori-react 8.10.1 → 8.12.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 (177) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.css +41 -14
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +2 -2
  4. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  5. package/dist/components/Auth/Auth.js +36 -8
  6. package/dist/components/Auth/Auth.js.map +1 -1
  7. package/dist/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +2 -2
  8. package/dist/components/Chat/Chat.js +2 -2
  9. package/dist/components/Chat/Chat.js.map +1 -1
  10. package/dist/components/ChatBubble/ChatBubble.css +81 -13
  11. package/dist/components/ChatBubble/ChatBubble.js +86 -19
  12. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  13. package/dist/components/ChatHistoryDrawer/ChatHistory.css +5 -1
  14. package/dist/components/ChatInputs/ChatInputs.d.ts +1 -0
  15. package/dist/components/ChatInputs/ChatInputs.js +8 -3
  16. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  17. package/dist/components/DateSelector/DateSelector.css +125 -104
  18. package/dist/components/DateSelector/DateSelector.d.ts +1 -1
  19. package/dist/components/DateSelector/DateSelector.js +110 -52
  20. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  21. package/dist/components/Header/Header.js +1 -1
  22. package/dist/components/Header/Header.js.map +1 -1
  23. package/dist/components/LoginDrawer/LoginDrawer.css +37 -5
  24. package/dist/components/LoginDrawer/LoginDrawer.d.ts +1 -2
  25. package/dist/components/LoginDrawer/LoginDrawer.js +2 -9
  26. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  27. package/dist/components/MediaWidget/MediaItemWidget.js +40 -5
  28. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  29. package/dist/components/MediaWidget/MediaWidget.css +4 -0
  30. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  31. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  32. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +1 -1
  33. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  34. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js +3 -0
  35. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js.map +1 -1
  36. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  37. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  38. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +16 -7
  39. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +6 -4
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -1
  41. package/dist/components/MemoriWidget/MemoriWidget.js +69 -25
  42. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  43. package/dist/components/UploadButton/UploadButton.js +2 -0
  44. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  45. package/dist/components/UploadButton/UploadImages/UploadImages.js +2 -2
  46. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  47. package/dist/components/ui/Drawer.css +8 -0
  48. package/dist/components/ui/Drawer.d.ts +2 -0
  49. package/dist/components/ui/Drawer.js +2 -2
  50. package/dist/components/ui/Drawer.js.map +1 -1
  51. package/dist/components/ui/Tooltip.css +49 -1
  52. package/dist/components/ui/Tooltip.d.ts +1 -1
  53. package/dist/locales/de.json +6 -1
  54. package/dist/locales/en.json +9 -1
  55. package/dist/locales/es.json +6 -1
  56. package/dist/locales/fr.json +5 -1
  57. package/dist/locales/it.json +8 -1
  58. package/dist/styles.css +3 -2
  59. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +41 -14
  60. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +2 -2
  61. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  62. package/esm/components/Auth/Auth.js +36 -8
  63. package/esm/components/Auth/Auth.js.map +1 -1
  64. package/esm/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +2 -2
  65. package/esm/components/Chat/Chat.js +2 -2
  66. package/esm/components/Chat/Chat.js.map +1 -1
  67. package/esm/components/ChatBubble/ChatBubble.css +81 -13
  68. package/esm/components/ChatBubble/ChatBubble.js +87 -20
  69. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  70. package/esm/components/ChatHistoryDrawer/ChatHistory.css +5 -1
  71. package/esm/components/ChatInputs/ChatInputs.d.ts +1 -0
  72. package/esm/components/ChatInputs/ChatInputs.js +8 -3
  73. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  74. package/esm/components/DateSelector/DateSelector.css +125 -104
  75. package/esm/components/DateSelector/DateSelector.d.ts +1 -1
  76. package/esm/components/DateSelector/DateSelector.js +111 -52
  77. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  78. package/esm/components/Header/Header.js +1 -1
  79. package/esm/components/Header/Header.js.map +1 -1
  80. package/esm/components/LoginDrawer/LoginDrawer.css +37 -5
  81. package/esm/components/LoginDrawer/LoginDrawer.d.ts +1 -2
  82. package/esm/components/LoginDrawer/LoginDrawer.js +2 -9
  83. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  84. package/esm/components/MediaWidget/MediaItemWidget.js +40 -5
  85. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  86. package/esm/components/MediaWidget/MediaWidget.css +4 -0
  87. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  88. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  89. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +1 -1
  90. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  91. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js +3 -0
  92. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js.map +1 -1
  93. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  94. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  95. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +16 -7
  96. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +6 -4
  97. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -1
  98. package/esm/components/MemoriWidget/MemoriWidget.js +69 -25
  99. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  100. package/esm/components/UploadButton/UploadButton.js +2 -0
  101. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  102. package/esm/components/UploadButton/UploadImages/UploadImages.js +2 -2
  103. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  104. package/esm/components/ui/Drawer.css +8 -0
  105. package/esm/components/ui/Drawer.d.ts +2 -0
  106. package/esm/components/ui/Drawer.js +2 -2
  107. package/esm/components/ui/Drawer.js.map +1 -1
  108. package/esm/components/ui/Tooltip.css +49 -1
  109. package/esm/components/ui/Tooltip.d.ts +1 -1
  110. package/esm/locales/de.json +6 -1
  111. package/esm/locales/en.json +9 -1
  112. package/esm/locales/es.json +6 -1
  113. package/esm/locales/fr.json +5 -1
  114. package/esm/locales/it.json +8 -1
  115. package/esm/styles.css +3 -2
  116. package/package.json +2 -2
  117. package/src/components/AgeVerificationModal/AgeVerificationModal.css +41 -14
  118. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +3 -1
  119. package/src/components/Auth/Auth.tsx +55 -11
  120. package/src/components/Avatar/Avatar.stories.tsx +3 -0
  121. package/src/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +2 -2
  122. package/src/components/Chat/Chat.stories.tsx +16 -2
  123. package/src/components/Chat/Chat.tsx +2 -1
  124. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +1036 -36
  125. package/src/components/ChatBubble/ChatBubble.css +81 -13
  126. package/src/components/ChatBubble/ChatBubble.stories.tsx +16 -2
  127. package/src/components/ChatBubble/ChatBubble.test.tsx +17 -0
  128. package/src/components/ChatBubble/ChatBubble.tsx +144 -31
  129. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +304 -8
  130. package/src/components/ChatHistoryDrawer/ChatHistory.css +5 -1
  131. package/src/components/ChatInputs/ChatInputs.tsx +14 -1
  132. package/src/components/DateSelector/DateSelector.css +125 -104
  133. package/src/components/DateSelector/DateSelector.stories.tsx +1 -1
  134. package/src/components/DateSelector/DateSelector.test.tsx +137 -23
  135. package/src/components/DateSelector/DateSelector.tsx +203 -177
  136. package/src/components/Header/Header.stories.tsx +5 -1
  137. package/src/components/Header/Header.tsx +1 -1
  138. package/src/components/Header/__snapshots__/Header.test.tsx.snap +1 -1
  139. package/src/components/LoginDrawer/LoginDrawer.css +37 -5
  140. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +0 -1
  141. package/src/components/LoginDrawer/LoginDrawer.test.tsx +0 -1
  142. package/src/components/LoginDrawer/LoginDrawer.tsx +0 -19
  143. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +69 -0
  144. package/src/components/MediaWidget/MediaItemWidget.tsx +66 -18
  145. package/src/components/MediaWidget/MediaWidget.css +4 -0
  146. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +10 -10
  147. package/src/components/MediaWidget/__snapshots__/MediaWidget.test.tsx.snap +2 -2
  148. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +996 -204
  149. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.tsx +2 -2
  150. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.tsx +1 -1
  151. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.tsx +3 -0
  152. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +56 -54
  153. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +16 -7
  154. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.tsx +12 -3
  155. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +6 -3
  156. package/src/components/MemoriWidget/MemoriWidget.tsx +123 -48
  157. package/src/components/UploadButton/UploadButton.tsx +2 -0
  158. package/src/components/UploadButton/UploadImages/UploadImages.tsx +3 -2
  159. package/src/components/layouts/FullBody/FullBody.stories.tsx +110 -0
  160. package/src/components/layouts/Totem/Totem.stories.tsx +131 -0
  161. package/src/components/layouts/ZoomedFullBody/ZoomedFullBody.stories.tsx +131 -0
  162. package/src/components/layouts/layouts.stories.tsx +55 -508
  163. package/src/components/ui/Drawer.css +8 -0
  164. package/src/components/ui/Drawer.tsx +16 -12
  165. package/src/components/ui/Tooltip.css +49 -1
  166. package/src/components/ui/Tooltip.tsx +1 -1
  167. package/src/index.stories.tsx +13 -320
  168. package/src/locales/de.json +6 -1
  169. package/src/locales/en.json +9 -1
  170. package/src/locales/es.json +6 -1
  171. package/src/locales/fr.json +5 -1
  172. package/src/locales/it.json +8 -1
  173. package/src/mocks/data.ts +4 -2
  174. package/src/styles.css +3 -2
  175. package/src/components/SignupForm/SignupForm.test.tsx +0 -40
  176. package/src/components/SignupForm/SignupForm.tsx +0 -457
  177. package/src/components/SignupForm/__snapshots__/SignupForm.test.tsx.snap +0 -247
package/src/styles.css CHANGED
@@ -89,7 +89,8 @@ body.sb-show-main #root,
89
89
  #storybook-docs,
90
90
  .memori-widget {
91
91
  --memori-font-family: 'Lexend Deca Variable', 'Lexend Deca', sans-serif;
92
- --memori-primary: rgb(130, 70, 175);
92
+ --memori-primary-rgb: 130, 70, 175;
93
+ --memori-primary: rgb(var(--memori-primary-rgb));
93
94
  --memori-primary-text: #fff;
94
95
  --memori-inner-content-pad: 1rem;
95
96
  --memori-inner-bg: transparent;
@@ -123,4 +124,4 @@ body.sb-show-main #root,
123
124
  .mobile-hidden {
124
125
  display: none;
125
126
  }
126
- }
127
+ }
@@ -1,40 +0,0 @@
1
- import React from 'react';
2
- import { render } from '@testing-library/react';
3
- import SignupForm from './SignupForm';
4
- import { tenant } from '../../mocks/data';
5
- import memoriApiClient from '@memori.ai/memori-api-client';
6
-
7
- beforeEach(() => {
8
- // @ts-ignore
9
- window.IntersectionObserver = jest.fn(() => ({
10
- observe: jest.fn(),
11
- unobserve: jest.fn(),
12
- disconnect: jest.fn(),
13
- takeRecords: jest.fn(),
14
- }));
15
- });
16
-
17
- it('renders SignupForm unchanged', () => {
18
- const { container } = render(
19
- <SignupForm
20
- apiClient={memoriApiClient()}
21
- tenant={tenant}
22
- onLogin={jest.fn()}
23
- goToLogin={jest.fn()}
24
- />
25
- );
26
- expect(container).toMatchSnapshot();
27
- });
28
-
29
- it('renders SignupForm on otp form unchanged', () => {
30
- const { container } = render(
31
- <SignupForm
32
- apiClient={memoriApiClient()}
33
- tenant={tenant}
34
- onLogin={jest.fn()}
35
- goToLogin={jest.fn()}
36
- __TEST__waitingForOtp
37
- />
38
- );
39
- expect(container).toMatchSnapshot();
40
- });
@@ -1,457 +0,0 @@
1
- import { User, Tenant } from '@memori.ai/memori-api-client/dist/types';
2
- import React, { useEffect, useState } from 'react';
3
- import Button from '../ui/Button';
4
- import { useTranslation } from 'react-i18next';
5
- import memoriApiClient from '@memori.ai/memori-api-client';
6
- import toast from 'react-hot-toast';
7
- import { mailRegEx, pwdRegEx, usernameRegEx } from '../../helpers/utils';
8
- import { getErrori18nKey } from '../../helpers/error';
9
-
10
- const reservedUserNames = [
11
- 'memori',
12
- 'private',
13
- 'public',
14
- 'api',
15
- '404',
16
- '500',
17
- 'it',
18
- 'en',
19
- 'account',
20
- 'auth',
21
- 'logout',
22
- 'privacy_and_cookie',
23
- 'unauthorized',
24
- 'users',
25
- 'virtual_spaces',
26
- ];
27
-
28
- export interface Props {
29
- tenant: Tenant;
30
- apiClient: ReturnType<typeof memoriApiClient>;
31
- onLogin: (user: User, token: string) => void;
32
- goToLogin: () => void;
33
- __TEST__waitingForOtp?: boolean;
34
- }
35
-
36
- const SignupForm = ({
37
- tenant,
38
- apiClient,
39
- onLogin,
40
- goToLogin,
41
- __TEST__waitingForOtp = false,
42
- }: Props) => {
43
- const { t, i18n } = useTranslation();
44
- const lang = i18n.language === 'it' ? 'it' : 'en';
45
-
46
- const { userSignUp, userConfirmSignUp, resendVerificationCode } =
47
- apiClient.backend;
48
-
49
- const [email, setEmail] = useState<string>();
50
- const [username, setUsername] = useState<string>();
51
- const [password, setPassword] = useState<string>();
52
- const [confirmPassword, setConfirmPassword] = useState<string>();
53
-
54
- const pwdAcceptable = !password || (password && pwdRegEx.test(password));
55
- const pwdGreen = pwdAcceptable && password && password.length >= 24;
56
- const pwdEmpty = !password || password.length === 0;
57
- const pwdMeterValue =
58
- !pwdAcceptable || pwdEmpty
59
- ? 0
60
- : password.length < 8
61
- ? 15
62
- : password.length >= 32
63
- ? 100
64
- : (password.length - 8) * (50 / 24) + 50;
65
-
66
- const [loading, setLoading] = useState(false);
67
- const [loadingOtp, setLoadingOtp] = useState(false);
68
- const [waitingForOtp, setWaitingForOtp] = useState(__TEST__waitingForOtp);
69
- const [error, setError] = useState<string | null>(null);
70
-
71
- const [referral, setReferral] = useState<string>();
72
- useEffect(() => {
73
- setReferral(window.location.href);
74
- }, []);
75
-
76
- const generateUsernameFromEmail = (email: string) =>
77
- email.split('@')[0].replace(/[^a-zA-Z0-9]/g, '');
78
-
79
- const signup = async (e: React.FormEvent<HTMLFormElement>) => {
80
- e.preventDefault();
81
- const form = e.currentTarget as HTMLFormElement;
82
-
83
- const tenantID = form.tenant.value ?? tenant.name;
84
-
85
- const eMail = (form.eMail.value ?? email).toLowerCase();
86
- const userName = form.userName.value ?? username;
87
- const password = form.password.value;
88
-
89
- const birthDate = new Date(form.birthDate?.value).toISOString();
90
- const tnCAndPPAccepted = form.tnCAndPPAccepted?.checked;
91
- const pAndCUAccepted = form.pAndCUAccepted?.checked;
92
-
93
- const referral = form.referral?.value;
94
-
95
- if (!eMail || !userName || !password || !birthDate || !tnCAndPPAccepted) {
96
- setError(t('missingData'));
97
- return;
98
- }
99
-
100
- setLoading(true);
101
- setError(null);
102
-
103
- const age =
104
- (new Date().getTime() - new Date(birthDate).getTime()) /
105
- 1000 /
106
- 60 /
107
- 60 /
108
- 24 /
109
- 365;
110
-
111
- if (age < 14) {
112
- toast.error(t('login.underage', { age: 14 }));
113
- setError(t('login.underage', { age: 14 }));
114
- return;
115
- }
116
-
117
- try {
118
- const { user, ...resp } = await userSignUp({
119
- tenant: tenantID,
120
- eMail,
121
- userName,
122
- password,
123
- birthDate,
124
- tnCAndPPAccepted,
125
- tnCAndPPAcceptanceDate: new Date().toISOString(),
126
- pAndCUAccepted,
127
- pAndCUAcceptanceDate: new Date().toISOString(),
128
- referral,
129
- });
130
- if (resp.resultCode !== 0) {
131
- console.error(resp);
132
- toast.error(t(getErrori18nKey(resp.resultCode)));
133
- } else if (user) {
134
- toast.success(t('success'));
135
- setWaitingForOtp(true);
136
- }
137
- } catch (e) {
138
- let err = e as Error;
139
- console.error('[signup]', err);
140
- if (err?.message) toast.error(err.message);
141
- } finally {
142
- setLoading(false);
143
- }
144
- };
145
-
146
- const resendOtp = async (e: React.MouseEvent<HTMLButtonElement>) => {
147
- e.preventDefault();
148
- if (!username) return;
149
-
150
- setLoadingOtp(true);
151
-
152
- try {
153
- const resp = await resendVerificationCode({
154
- tenant: tenant?.name,
155
- userName: username,
156
- });
157
-
158
- if (resp.resultCode === 0) {
159
- toast.success(t('resentVerificationCode'));
160
- } else {
161
- console.error(resp);
162
- toast.error(t(getErrori18nKey(resp.resultCode)));
163
- }
164
- } catch (e) {
165
- let err = e as Error;
166
- console.error('[resend otp]', err);
167
- if (err?.message) toast.error(err.message);
168
- } finally {
169
- setLoadingOtp(false);
170
- }
171
- };
172
-
173
- const validateOtp = async (e: React.FormEvent<HTMLFormElement>) => {
174
- e.preventDefault();
175
- const form = e.currentTarget as HTMLFormElement;
176
-
177
- const tenantID = form.tenant.value ?? tenant.name;
178
- const userName = form.userName.value ?? username;
179
- const pwd = form.password.value ?? password;
180
-
181
- const verificationCode = form.verificationCode.value;
182
-
183
- setLoading(true);
184
- setError(null);
185
-
186
- try {
187
- const { user, token, ...resp } = await userConfirmSignUp({
188
- tenant: tenantID,
189
- userName,
190
- password: pwd,
191
- verificationCode,
192
- });
193
-
194
- if (resp.resultCode !== 0) {
195
- console.error(resp);
196
- toast.error(t(getErrori18nKey(resp.resultCode)));
197
- } else if (user && token) {
198
- toast.success(t('success'));
199
- onLogin(user, token);
200
- }
201
- } catch (e) {
202
- let err = e as Error;
203
- console.error('[validate otp]', err);
204
- if (err?.message) toast.error(err.message);
205
- } finally {
206
- setLoading(false);
207
- }
208
- };
209
-
210
- return waitingForOtp ? (
211
- <>
212
- <form className="memori--login-drawer--form" onSubmit={validateOtp}>
213
- <input type="hidden" name="userName" value={username} />
214
- <input type="hidden" name="password" value={password} />
215
- <input type="hidden" name="tenant" value={tenant.name} />
216
-
217
- <label htmlFor="#verificationCode">
218
- {t('login.otpCode')}
219
- <input
220
- id="verificationCode"
221
- name="verificationCode"
222
- type="text"
223
- required
224
- autoComplete="one-time-code"
225
- placeholder={t('login.otpCode') || 'OTP'}
226
- />
227
- </label>
228
- <p>
229
- <Button outlined onClick={resendOtp} loading={loadingOtp}>
230
- {t('login.resendVerificationCode')}
231
- </Button>
232
- </p>
233
-
234
- <Button htmlType="submit" primary loading={loading}>
235
- {t('confirm')}
236
- </Button>
237
- </form>
238
- {error && (
239
- <p role="alert" className="memori--login-drawer--error">
240
- {error}
241
- </p>
242
- )}
243
- </>
244
- ) : (
245
- <>
246
- <form className="memori--login-drawer--form" onSubmit={signup}>
247
- <input type="hidden" name="tenant" value={tenant.name} />
248
- <input type="hidden" name="referral" value={referral} />
249
-
250
- <label htmlFor="#eMail">
251
- {t('login.email')}
252
- <input
253
- type="email"
254
- name="eMail"
255
- id="eMail"
256
- required
257
- autoComplete="email"
258
- placeholder={t('login.email') || 'Email'}
259
- onChange={e => setEmail(e.target.value)}
260
- aria-invalid={!!email?.length && !mailRegEx.test(email)}
261
- />
262
- </label>
263
- {!!email?.length && !mailRegEx.test(email) && (
264
- <p className="memori--login-drawer--inline-error">
265
- {t('login.emailFormatError')}
266
- </p>
267
- )}
268
-
269
- <label htmlFor="userName">
270
- {t('login.username')}
271
- <input
272
- type="text"
273
- name="userName"
274
- id="userName"
275
- required
276
- autoComplete="username"
277
- placeholder={t('login.username') || 'Username'}
278
- onFocus={() => {
279
- if (!username?.length && !!email?.length) {
280
- let username = generateUsernameFromEmail(email);
281
- const field = document.getElementById(
282
- 'userName'
283
- ) as HTMLInputElement | null;
284
- if (field) {
285
- field.value = username;
286
- setUsername(username);
287
- }
288
- }
289
- }}
290
- onChange={e => setUsername(e.target.value)}
291
- aria-invalid={
292
- !!username?.length &&
293
- (reservedUserNames.includes(username.toLowerCase()) ||
294
- !usernameRegEx.test(username))
295
- }
296
- />
297
- </label>
298
- {!!username?.length &&
299
- reservedUserNames.includes(username.toLowerCase()) && (
300
- <p className="memori--login-drawer--inline-error">
301
- {t('login.usernameContainsReservedWord')}
302
- </p>
303
- )}
304
- {!!username?.length && !usernameRegEx.test(username) && (
305
- <p className="memori--login-drawer--inline-error">
306
- {t('login.usernameFormatError')}
307
- </p>
308
- )}
309
-
310
- <label htmlFor="#birthDate">
311
- {t('login.birthDate')}
312
- <input
313
- id="birthDate"
314
- name="birthDate"
315
- type="date"
316
- required
317
- autoComplete="bday"
318
- />
319
- </label>
320
- <p>
321
- <small>{t('login.birthDateHelper')}</small>
322
- </p>
323
-
324
- <label htmlFor="#password">
325
- {t('login.password')}
326
- <input
327
- id="password"
328
- name="password"
329
- type="password"
330
- required
331
- autoComplete="new-password"
332
- placeholder={t('login.password') || 'Password'}
333
- onChange={e => setPassword(e.target.value)}
334
- aria-invalid={!pwdAcceptable}
335
- />
336
- </label>
337
- {!pwdAcceptable && (
338
- <p className="memori--login-drawer--inline-error">
339
- {t('login.passwordFormatError')}
340
- </p>
341
- )}
342
-
343
- <label htmlFor="#confirm-password">
344
- {t('login.confirmPassword')}
345
- <input
346
- id="confirm-password"
347
- name="confirmPassword"
348
- type="password"
349
- required
350
- autoComplete="new-password"
351
- placeholder={t('login.confirmPassword') || 'Password'}
352
- onChange={e => setConfirmPassword(e.target.value)}
353
- aria-invalid={
354
- !!password?.length &&
355
- !!confirmPassword?.length &&
356
- password !== confirmPassword
357
- }
358
- />
359
- </label>
360
- {!!password?.length &&
361
- !!confirmPassword?.length &&
362
- password !== confirmPassword && (
363
- <p className="memori--login-drawer--inline-error">
364
- {t('login.passwordMatchingError')}
365
- </p>
366
- )}
367
-
368
- <meter
369
- className="memori--login-drawer--password-meter"
370
- min={0}
371
- low={33}
372
- high={66}
373
- optimum={80}
374
- max={100}
375
- value={pwdMeterValue}
376
- id="password-strength-meter"
377
- />
378
- <small>
379
- {t(
380
- `login.pwd${
381
- pwdGreen ? 'Strong' : pwdAcceptable ? 'Acceptable' : 'Weak'
382
- }`
383
- )}
384
- </small>
385
-
386
- <label className="memori-checkbox">
387
- <span className="memori-checkbox--input-wrapper">
388
- <input
389
- type="checkbox"
390
- name="tnCAndPPAccepted"
391
- required
392
- className="memori-checkbox--input"
393
- />
394
- <span className="memori-checkbox--inner" />
395
- </span>
396
- <span className="memori-checkbox--text">
397
- {t('login.privacyLabel')}{' '}
398
- <a
399
- href={`https://memori.ai/${lang}/privacy_and_cookie`}
400
- target="_blank"
401
- rel="noopener noreferrer"
402
- >
403
- {t('login.privacyAndCookiePolicy')}
404
- </a>{' '}
405
- {t('login.and')}{' '}
406
- <a
407
- href={`https://memori.ai/${lang}/tos`}
408
- target="_blank"
409
- rel="noopener noreferrer"
410
- >
411
- {t('login.termsOfService')}
412
- </a>
413
- </span>
414
- </label>
415
-
416
- <label className="memori-checkbox">
417
- <span className="memori-checkbox--input-wrapper">
418
- <input
419
- type="checkbox"
420
- name="pAndCUAccepted"
421
- className="memori-checkbox--input"
422
- />
423
- <span className="memori-checkbox--inner" />
424
- </span>
425
- <span className="memori-checkbox--text">
426
- {t('login.pAndCUAccepted')}{' '}
427
- <small>
428
- <em>({t('login.optional')})</em>
429
- </small>
430
- </span>
431
- </label>
432
- <p>
433
- <small>{t('login.deepThoughtExplaination')}</small>
434
- </p>
435
-
436
- <Button htmlType="submit" primary loading={loading}>
437
- {t('login.signUp')}
438
- </Button>
439
-
440
- <p className="memori--login-drawer--signup">
441
- {t('login.alreadyHaveAnAccount')}{' '}
442
- <Button outlined onClick={goToLogin}>
443
- {t('login.backToLogin')}
444
- </Button>
445
- </p>
446
- </form>
447
-
448
- {error && (
449
- <p role="alert" className="memori--login-drawer--error">
450
- {error}
451
- </p>
452
- )}
453
- </>
454
- );
455
- };
456
-
457
- export default SignupForm;