@memori.ai/memori-react 6.4.5 → 6.5.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.
- package/CHANGELOG.md +40 -0
- package/dist/components/AccountForm/AccountForm.d.ts +9 -0
- package/dist/components/AccountForm/AccountForm.js +122 -0
- package/dist/components/AccountForm/AccountForm.js.map +1 -0
- package/dist/components/Chat/Chat.d.ts +1 -0
- package/dist/components/Chat/Chat.js +2 -2
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/LoginDrawer/LoginDrawer.css +59 -3
- package/dist/components/LoginDrawer/LoginDrawer.d.ts +4 -2
- package/dist/components/LoginDrawer/LoginDrawer.js +110 -25
- package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
- package/dist/components/MemoriWidget/MemoriWidget.js +10 -0
- package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
- package/dist/components/SignupForm/SignupForm.d.ts +10 -0
- package/dist/components/SignupForm/SignupForm.js +201 -0
- package/dist/components/SignupForm/SignupForm.js.map +1 -0
- package/dist/components/VenueWidget/VenueWidget.css +14 -0
- package/dist/components/ui/Checkbox.css +2 -4
- package/dist/components/ui/Details.css +66 -0
- package/dist/helpers/constants.js +1 -0
- package/dist/helpers/constants.js.map +1 -1
- package/dist/helpers/error.js +4 -0
- package/dist/helpers/error.js.map +1 -1
- package/dist/helpers/utils.js +3 -3
- package/dist/helpers/utils.js.map +1 -1
- package/dist/locales/en.json +29 -0
- package/dist/locales/it.json +31 -2
- package/dist/styles.css +5 -3
- package/esm/components/AccountForm/AccountForm.d.ts +9 -0
- package/esm/components/AccountForm/AccountForm.js +119 -0
- package/esm/components/AccountForm/AccountForm.js.map +1 -0
- package/esm/components/Chat/Chat.d.ts +1 -0
- package/esm/components/Chat/Chat.js +2 -2
- package/esm/components/Chat/Chat.js.map +1 -1
- package/esm/components/LoginDrawer/LoginDrawer.css +59 -3
- package/esm/components/LoginDrawer/LoginDrawer.d.ts +4 -2
- package/esm/components/LoginDrawer/LoginDrawer.js +110 -24
- package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
- package/esm/components/MemoriWidget/MemoriWidget.js +10 -0
- package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
- package/esm/components/SignupForm/SignupForm.d.ts +10 -0
- package/esm/components/SignupForm/SignupForm.js +198 -0
- package/esm/components/SignupForm/SignupForm.js.map +1 -0
- package/esm/components/VenueWidget/VenueWidget.css +14 -0
- package/esm/components/ui/Checkbox.css +2 -4
- package/esm/components/ui/Details.css +66 -0
- package/esm/helpers/constants.js +1 -0
- package/esm/helpers/constants.js.map +1 -1
- package/esm/helpers/error.js +4 -0
- package/esm/helpers/error.js.map +1 -1
- package/esm/helpers/utils.js +3 -3
- package/esm/helpers/utils.js.map +1 -1
- package/esm/locales/en.json +29 -0
- package/esm/locales/it.json +31 -2
- package/esm/styles.css +5 -3
- package/package.json +1 -1
- package/src/components/AccountForm/AccountForm.test.tsx +26 -0
- package/src/components/AccountForm/AccountForm.tsx +326 -0
- package/src/components/AccountForm/__snapshots__/AccountForm.test.tsx.snap +202 -0
- package/src/components/Chat/Chat.tsx +3 -0
- package/src/components/LoginDrawer/LoginDrawer.css +59 -3
- package/src/components/LoginDrawer/LoginDrawer.stories.tsx +19 -0
- package/src/components/LoginDrawer/LoginDrawer.test.tsx +48 -2
- package/src/components/LoginDrawer/LoginDrawer.tsx +233 -25
- package/src/components/LoginDrawer/__snapshots__/LoginDrawer.test.tsx.snap +24 -0
- package/src/components/MemoriWidget/MemoriWidget.tsx +15 -0
- package/src/components/SignupForm/SignupForm.test.tsx +39 -0
- package/src/components/SignupForm/SignupForm.tsx +458 -0
- package/src/components/SignupForm/__snapshots__/SignupForm.test.tsx.snap +247 -0
- package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +6 -0
- package/src/components/VenueWidget/VenueWidget.css +14 -0
- package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +6 -0
- package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +6 -0
- package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +6 -0
- package/src/components/ui/Checkbox.css +2 -4
- package/src/components/ui/Details.css +66 -0
- package/src/helpers/constants.ts +1 -0
- package/src/helpers/error.ts +4 -0
- package/src/helpers/utils.ts +4 -3
- package/src/locales/en.json +29 -0
- package/src/locales/it.json +32 -3
- package/src/mocks/data.ts +1 -0
- package/src/styles.css +5 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import { render } from '@testing-library/react';
|
|
2
3
|
import LoginDrawer from './LoginDrawer';
|
|
3
|
-
import
|
|
4
|
-
import { tenant, expertReference, user } from '../../mocks/data';
|
|
4
|
+
import { tenant, user } from '../../mocks/data';
|
|
5
5
|
|
|
6
6
|
beforeEach(() => {
|
|
7
7
|
// @ts-ignore
|
|
@@ -84,3 +84,49 @@ it('renders LoginDrawer logged in unchanged', () => {
|
|
|
84
84
|
);
|
|
85
85
|
expect(container).toMatchSnapshot();
|
|
86
86
|
});
|
|
87
|
+
|
|
88
|
+
it('renders LoginDrawer on signup unchanged', () => {
|
|
89
|
+
const { container } = render(
|
|
90
|
+
<LoginDrawer
|
|
91
|
+
onClose={jest.fn()}
|
|
92
|
+
apiUrl="https://backend.memori.ai"
|
|
93
|
+
tenant={tenant}
|
|
94
|
+
onLogin={jest.fn()}
|
|
95
|
+
onLogout={jest.fn()}
|
|
96
|
+
__TEST__signup
|
|
97
|
+
open
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
expect(container).toMatchSnapshot();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('renders LoginDrawer on signup waiting for otp unchanged', () => {
|
|
104
|
+
const { container } = render(
|
|
105
|
+
<LoginDrawer
|
|
106
|
+
onClose={jest.fn()}
|
|
107
|
+
apiUrl="https://backend.memori.ai"
|
|
108
|
+
tenant={tenant}
|
|
109
|
+
onLogin={jest.fn()}
|
|
110
|
+
onLogout={jest.fn()}
|
|
111
|
+
__TEST__signup
|
|
112
|
+
__TEST__waitingForOtp
|
|
113
|
+
open
|
|
114
|
+
/>
|
|
115
|
+
);
|
|
116
|
+
expect(container).toMatchSnapshot();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('renders LoginDrawer on change password unchanged', () => {
|
|
120
|
+
const { container } = render(
|
|
121
|
+
<LoginDrawer
|
|
122
|
+
onClose={jest.fn()}
|
|
123
|
+
apiUrl="https://backend.memori.ai"
|
|
124
|
+
tenant={tenant}
|
|
125
|
+
onLogin={jest.fn()}
|
|
126
|
+
onLogout={jest.fn()}
|
|
127
|
+
__TEST__changePwd
|
|
128
|
+
open
|
|
129
|
+
/>
|
|
130
|
+
);
|
|
131
|
+
expect(container).toMatchSnapshot();
|
|
132
|
+
});
|
|
@@ -7,8 +7,9 @@ import { useTranslation } from 'react-i18next';
|
|
|
7
7
|
import cx from 'classnames';
|
|
8
8
|
import memoriApiClient from '@memori.ai/memori-api-client';
|
|
9
9
|
import { getErrori18nKey } from '../../helpers/error';
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
import { mailRegEx, pwdRegEx } from '../../helpers/utils';
|
|
11
|
+
import SignupForm from '../SignupForm/SignupForm';
|
|
12
|
+
import AccountForm from '../AccountForm/AccountForm';
|
|
12
13
|
|
|
13
14
|
export interface Props {
|
|
14
15
|
open?: boolean;
|
|
@@ -19,7 +20,10 @@ export interface Props {
|
|
|
19
20
|
onLogout: () => void;
|
|
20
21
|
tenant: Tenant;
|
|
21
22
|
apiUrl: string;
|
|
23
|
+
__TEST__signup?: boolean;
|
|
22
24
|
__TEST__needMissingData?: boolean;
|
|
25
|
+
__TEST__waitingForOtp?: boolean;
|
|
26
|
+
__TEST__changePwd?: boolean;
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
const LoginDrawer = ({
|
|
@@ -31,7 +35,10 @@ const LoginDrawer = ({
|
|
|
31
35
|
loginToken,
|
|
32
36
|
tenant,
|
|
33
37
|
apiUrl,
|
|
38
|
+
__TEST__signup = false,
|
|
34
39
|
__TEST__needMissingData = false,
|
|
40
|
+
__TEST__waitingForOtp = false,
|
|
41
|
+
__TEST__changePwd = false,
|
|
35
42
|
}: Props) => {
|
|
36
43
|
const { t, i18n } = useTranslation();
|
|
37
44
|
const lang = i18n.language === 'it' ? 'it' : 'en';
|
|
@@ -39,7 +46,23 @@ const LoginDrawer = ({
|
|
|
39
46
|
const client = memoriApiClient(apiUrl);
|
|
40
47
|
const { userLogin, updateUser } = client.backend;
|
|
41
48
|
|
|
49
|
+
const isUserLoggedIn = user?.userID && loginToken;
|
|
50
|
+
|
|
42
51
|
const [loading, setLoading] = useState(false);
|
|
52
|
+
const [error, setError] = useState<string | null>(null);
|
|
53
|
+
|
|
54
|
+
const [showSignup, setShowSignup] = useState(__TEST__signup);
|
|
55
|
+
const [userMustChangePwd, setUserMustChangePwd] = useState<User | undefined>(
|
|
56
|
+
__TEST__changePwd
|
|
57
|
+
? {
|
|
58
|
+
flowID: 'flowID',
|
|
59
|
+
tenant: tenant.id,
|
|
60
|
+
eMail: 'email',
|
|
61
|
+
userName: 'username',
|
|
62
|
+
password: 'password',
|
|
63
|
+
}
|
|
64
|
+
: undefined
|
|
65
|
+
);
|
|
43
66
|
const [needsMissingData, setNeedsMissingData] = useState<{
|
|
44
67
|
token: string;
|
|
45
68
|
birthDate?: boolean;
|
|
@@ -53,14 +76,6 @@ const LoginDrawer = ({
|
|
|
53
76
|
}
|
|
54
77
|
: ({} as any)
|
|
55
78
|
);
|
|
56
|
-
const [error, setError] = useState<string | null>(null);
|
|
57
|
-
|
|
58
|
-
const [redirectTo, setRedirectTo] = useState<string | null>(null);
|
|
59
|
-
useEffect(() => {
|
|
60
|
-
setRedirectTo(window.location.href);
|
|
61
|
-
}, []);
|
|
62
|
-
|
|
63
|
-
const isUserLoggedIn = user?.userID && loginToken;
|
|
64
79
|
|
|
65
80
|
const login = (e: React.FormEvent<HTMLFormElement>) => {
|
|
66
81
|
e.preventDefault();
|
|
@@ -84,27 +99,37 @@ const LoginDrawer = ({
|
|
|
84
99
|
setError(null);
|
|
85
100
|
userLogin(user)
|
|
86
101
|
.then(data => {
|
|
87
|
-
if (data.resultCode
|
|
102
|
+
if (data.resultCode === -14) {
|
|
103
|
+
setUserMustChangePwd({
|
|
104
|
+
tenant: tenant.id,
|
|
105
|
+
eMail: isEmail ? userNameOrEmail : undefined,
|
|
106
|
+
userName: isEmail ? undefined : userNameOrEmail,
|
|
107
|
+
password: password,
|
|
108
|
+
flowID: (data.flowID || data.user?.flowID) as string,
|
|
109
|
+
});
|
|
110
|
+
} else if (data.resultCode !== 0) {
|
|
88
111
|
console.error(data);
|
|
89
|
-
toast.error(t(getErrori18nKey(data.resultCode)
|
|
112
|
+
toast.error(t(getErrori18nKey(data.resultCode)));
|
|
90
113
|
setError(data.resultMessage);
|
|
91
114
|
} else if (data.user && data.token) {
|
|
92
|
-
onLogin(data.user as User, data.token);
|
|
93
|
-
|
|
94
115
|
if (!data.user?.tnCAndPPAccepted || !data.user?.birthDate) {
|
|
95
116
|
setNeedsMissingData({
|
|
96
117
|
token: data.token,
|
|
97
118
|
birthDate: !data.user?.birthDate,
|
|
98
119
|
tnCAndPPAccepted: !data.user?.tnCAndPPAccepted,
|
|
99
120
|
});
|
|
121
|
+
} else {
|
|
122
|
+
onLogin(data.user as User, data.token);
|
|
100
123
|
}
|
|
101
124
|
}
|
|
102
125
|
})
|
|
103
126
|
.catch(err => {
|
|
104
127
|
console.error('[LOGIN]', err);
|
|
105
|
-
toast.error(err);
|
|
106
128
|
|
|
107
|
-
if (err.message)
|
|
129
|
+
if (err.message) {
|
|
130
|
+
toast.error(err.message);
|
|
131
|
+
setError(err.message);
|
|
132
|
+
}
|
|
108
133
|
})
|
|
109
134
|
.finally(() => {
|
|
110
135
|
setLoading(false);
|
|
@@ -149,7 +174,7 @@ const LoginDrawer = ({
|
|
|
149
174
|
);
|
|
150
175
|
if (resp.resultCode !== 0) {
|
|
151
176
|
console.error(resp);
|
|
152
|
-
toast.error(t(getErrori18nKey(resp.resultCode)
|
|
177
|
+
toast.error(t(getErrori18nKey(resp.resultCode)));
|
|
153
178
|
setError(resp.resultMessage);
|
|
154
179
|
} else {
|
|
155
180
|
toast.success(t('success'));
|
|
@@ -157,23 +182,98 @@ const LoginDrawer = ({
|
|
|
157
182
|
}
|
|
158
183
|
};
|
|
159
184
|
|
|
185
|
+
const [password, setPassword] = useState<string>();
|
|
186
|
+
const [confirmPassword, setConfirmPassword] = useState<string>();
|
|
187
|
+
const pwdAcceptable = !password || (password && pwdRegEx.test(password));
|
|
188
|
+
const pwdGreen = pwdAcceptable && password && password.length >= 24;
|
|
189
|
+
const pwdEmpty = !password || password.length === 0;
|
|
190
|
+
const pwdMeterValue =
|
|
191
|
+
!pwdAcceptable || pwdEmpty
|
|
192
|
+
? 0
|
|
193
|
+
: password.length < 8
|
|
194
|
+
? 15
|
|
195
|
+
: password.length >= 32
|
|
196
|
+
? 100
|
|
197
|
+
: (password.length - 8) * (50 / 24) + 50;
|
|
198
|
+
|
|
199
|
+
const changePassword = async (e: React.FormEvent<HTMLFormElement>) => {
|
|
200
|
+
e.preventDefault();
|
|
201
|
+
|
|
202
|
+
const form = e.currentTarget as HTMLFormElement;
|
|
203
|
+
|
|
204
|
+
const tenantID = form.tenant.value ?? tenant.id;
|
|
205
|
+
const flowID = form.flowID.value ?? userMustChangePwd?.flowID;
|
|
206
|
+
const eMail = form.eMail.value ?? userMustChangePwd?.eMail;
|
|
207
|
+
const userName = form.userName.value ?? userMustChangePwd?.userName;
|
|
208
|
+
const password = form.password.value ?? userMustChangePwd?.password;
|
|
209
|
+
const newPassword = form.newPassword.value;
|
|
210
|
+
|
|
211
|
+
if (!newPassword?.length || !pwdAcceptable) {
|
|
212
|
+
setError(t('login.passwordFormatError'));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
setLoading(true);
|
|
217
|
+
|
|
218
|
+
const user: User = {
|
|
219
|
+
tenant: tenantID,
|
|
220
|
+
flowID,
|
|
221
|
+
eMail,
|
|
222
|
+
userName,
|
|
223
|
+
password,
|
|
224
|
+
newPassword,
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
const { user: patchedUser, token, ...resp } = await userLogin(user);
|
|
229
|
+
|
|
230
|
+
if (resp.resultCode !== 0) {
|
|
231
|
+
console.error(resp);
|
|
232
|
+
toast.error(t(getErrori18nKey(resp.resultCode)));
|
|
233
|
+
setError(resp.resultMessage);
|
|
234
|
+
} else if (patchedUser && token) {
|
|
235
|
+
toast.success(t('success'));
|
|
236
|
+
onLogin(patchedUser || user, token);
|
|
237
|
+
}
|
|
238
|
+
} catch (e) {
|
|
239
|
+
let err = e as Error;
|
|
240
|
+
console.error('[LOGIN/CHANGE PWD]', err);
|
|
241
|
+
|
|
242
|
+
if (err.message) {
|
|
243
|
+
toast.error(err.message);
|
|
244
|
+
setError(err.message);
|
|
245
|
+
}
|
|
246
|
+
} finally {
|
|
247
|
+
setLoading(false);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
160
251
|
return (
|
|
161
252
|
<Drawer
|
|
162
253
|
open={open}
|
|
163
254
|
onClose={onClose}
|
|
164
255
|
className={cx('memori--login-drawer', {
|
|
165
256
|
'memori--login-drawer--logged': isUserLoggedIn,
|
|
257
|
+
'memori--login-drawer--signup': showSignup,
|
|
166
258
|
})}
|
|
167
259
|
title={
|
|
168
|
-
<
|
|
260
|
+
<span className="memori--login-drawer--title">
|
|
169
261
|
{isUserLoggedIn
|
|
170
262
|
? t('login.loggedDrawerTitle', { name: user.userName })
|
|
263
|
+
: showSignup
|
|
264
|
+
? t('login.signupDrawerTitle')
|
|
171
265
|
: t('login.loginDrawerTitle')}
|
|
172
|
-
</
|
|
266
|
+
</span>
|
|
173
267
|
}
|
|
174
268
|
>
|
|
175
269
|
{isUserLoggedIn ? (
|
|
176
270
|
<div className="memori--login-drawer--logged">
|
|
271
|
+
{user.avatarURL && (
|
|
272
|
+
<figure className="memori--login-drawer--avatar">
|
|
273
|
+
<img src={user.avatarURL} alt={user.userName} />
|
|
274
|
+
</figure>
|
|
275
|
+
)}
|
|
276
|
+
|
|
177
277
|
<Button
|
|
178
278
|
primary
|
|
179
279
|
onClick={() => {
|
|
@@ -182,6 +282,13 @@ const LoginDrawer = ({
|
|
|
182
282
|
>
|
|
183
283
|
{t('login.logout')}
|
|
184
284
|
</Button>
|
|
285
|
+
|
|
286
|
+
<AccountForm
|
|
287
|
+
user={user}
|
|
288
|
+
loginToken={loginToken}
|
|
289
|
+
apiUrl={apiUrl}
|
|
290
|
+
onUserUpdate={user => onLogin(user, loginToken)}
|
|
291
|
+
/>
|
|
185
292
|
</div>
|
|
186
293
|
) : needsMissingData?.token?.length ? (
|
|
187
294
|
<>
|
|
@@ -272,6 +379,111 @@ const LoginDrawer = ({
|
|
|
272
379
|
</Button>
|
|
273
380
|
</form>
|
|
274
381
|
</>
|
|
382
|
+
) : userMustChangePwd?.flowID ? (
|
|
383
|
+
<>
|
|
384
|
+
<p>{t('login.mustChangePassword')}</p>
|
|
385
|
+
|
|
386
|
+
<form
|
|
387
|
+
className="memori--login-drawer--form"
|
|
388
|
+
onSubmit={changePassword}
|
|
389
|
+
>
|
|
390
|
+
<input
|
|
391
|
+
type="hidden"
|
|
392
|
+
name="tenant"
|
|
393
|
+
value={userMustChangePwd.tenant ?? tenant?.id}
|
|
394
|
+
/>
|
|
395
|
+
<input
|
|
396
|
+
type="hidden"
|
|
397
|
+
name="flowID"
|
|
398
|
+
value={userMustChangePwd.flowID}
|
|
399
|
+
/>
|
|
400
|
+
<input type="hidden" name="eMail" value={userMustChangePwd.eMail} />
|
|
401
|
+
<input
|
|
402
|
+
type="hidden"
|
|
403
|
+
name="userName"
|
|
404
|
+
value={userMustChangePwd.userName}
|
|
405
|
+
/>
|
|
406
|
+
<input
|
|
407
|
+
type="hidden"
|
|
408
|
+
name="password"
|
|
409
|
+
value={userMustChangePwd.password}
|
|
410
|
+
/>
|
|
411
|
+
|
|
412
|
+
<label htmlFor="#newPassword">
|
|
413
|
+
{t('login.password')}
|
|
414
|
+
<input
|
|
415
|
+
id="newPassword"
|
|
416
|
+
name="newPassword"
|
|
417
|
+
type="password"
|
|
418
|
+
required
|
|
419
|
+
autoComplete="new-password"
|
|
420
|
+
placeholder={t('login.password') || 'Password'}
|
|
421
|
+
onChange={e => setPassword(e.target.value)}
|
|
422
|
+
aria-invalid={!pwdAcceptable}
|
|
423
|
+
/>
|
|
424
|
+
</label>
|
|
425
|
+
{!pwdAcceptable && (
|
|
426
|
+
<p className="memori--login-drawer--inline-error">
|
|
427
|
+
{t('login.passwordFormatError')}
|
|
428
|
+
</p>
|
|
429
|
+
)}
|
|
430
|
+
|
|
431
|
+
<label htmlFor="#confirm-password">
|
|
432
|
+
{t('login.confirmPassword')}
|
|
433
|
+
<input
|
|
434
|
+
id="confirm-password"
|
|
435
|
+
name="confirmPassword"
|
|
436
|
+
type="password"
|
|
437
|
+
required
|
|
438
|
+
autoComplete="new-password"
|
|
439
|
+
placeholder={t('login.confirmPassword') || 'Password'}
|
|
440
|
+
onChange={e => setConfirmPassword(e.target.value)}
|
|
441
|
+
aria-invalid={
|
|
442
|
+
!!password?.length &&
|
|
443
|
+
!!confirmPassword?.length &&
|
|
444
|
+
password !== confirmPassword
|
|
445
|
+
}
|
|
446
|
+
/>
|
|
447
|
+
</label>
|
|
448
|
+
{!!password?.length &&
|
|
449
|
+
!!confirmPassword?.length &&
|
|
450
|
+
password !== confirmPassword && (
|
|
451
|
+
<p className="memori--login-drawer--inline-error">
|
|
452
|
+
{t('login.passwordMatchingError')}
|
|
453
|
+
</p>
|
|
454
|
+
)}
|
|
455
|
+
|
|
456
|
+
<meter
|
|
457
|
+
className="memori--login-drawer--password-meter"
|
|
458
|
+
min={0}
|
|
459
|
+
low={33}
|
|
460
|
+
high={66}
|
|
461
|
+
optimum={80}
|
|
462
|
+
max={100}
|
|
463
|
+
value={pwdMeterValue}
|
|
464
|
+
id="password-strength-meter"
|
|
465
|
+
/>
|
|
466
|
+
<small>
|
|
467
|
+
{t(
|
|
468
|
+
`login.pwd${
|
|
469
|
+
pwdGreen ? 'Strong' : pwdAcceptable ? 'Acceptable' : 'Weak'
|
|
470
|
+
}`
|
|
471
|
+
)}
|
|
472
|
+
</small>
|
|
473
|
+
|
|
474
|
+
<Button htmlType="submit" primary loading={loading}>
|
|
475
|
+
{t('confirm')}
|
|
476
|
+
</Button>
|
|
477
|
+
</form>
|
|
478
|
+
</>
|
|
479
|
+
) : showSignup ? (
|
|
480
|
+
<SignupForm
|
|
481
|
+
tenant={tenant}
|
|
482
|
+
apiUrl={apiUrl}
|
|
483
|
+
onLogin={onLogin}
|
|
484
|
+
goToLogin={() => setShowSignup(false)}
|
|
485
|
+
__TEST__waitingForOtp={__TEST__waitingForOtp}
|
|
486
|
+
/>
|
|
275
487
|
) : (
|
|
276
488
|
<>
|
|
277
489
|
<form className="memori--login-drawer--form" onSubmit={login}>
|
|
@@ -305,13 +517,9 @@ const LoginDrawer = ({
|
|
|
305
517
|
{!tenant?.disableRegistration ? (
|
|
306
518
|
<p className="memori--login-drawer--signup">
|
|
307
519
|
{t('login.newUserSignUp')}{' '}
|
|
308
|
-
<
|
|
309
|
-
href={`https://${
|
|
310
|
-
tenant.name || 'www.aisuru.com'
|
|
311
|
-
}/${lang}/auth?signup=1&redirectTo=${redirectTo}`}
|
|
312
|
-
>
|
|
520
|
+
<Button outlined onClick={() => setShowSignup(true)}>
|
|
313
521
|
{t('login.signUp')}
|
|
314
|
-
</
|
|
522
|
+
</Button>
|
|
315
523
|
</p>
|
|
316
524
|
) : tenant.adminEmail ? (
|
|
317
525
|
<div className="memori--login-drawer--signup">
|
|
@@ -18,6 +18,30 @@ exports[`renders LoginDrawer logged with missing data unchanged 1`] = `
|
|
|
18
18
|
</div>
|
|
19
19
|
`;
|
|
20
20
|
|
|
21
|
+
exports[`renders LoginDrawer on change password unchanged 1`] = `
|
|
22
|
+
<div>
|
|
23
|
+
<div
|
|
24
|
+
style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
|
|
25
|
+
/>
|
|
26
|
+
</div>
|
|
27
|
+
`;
|
|
28
|
+
|
|
29
|
+
exports[`renders LoginDrawer on signup unchanged 1`] = `
|
|
30
|
+
<div>
|
|
31
|
+
<div
|
|
32
|
+
style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
|
|
33
|
+
/>
|
|
34
|
+
</div>
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
exports[`renders LoginDrawer on signup waiting for otp unchanged 1`] = `
|
|
38
|
+
<div>
|
|
39
|
+
<div
|
|
40
|
+
style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
|
|
41
|
+
/>
|
|
42
|
+
</div>
|
|
43
|
+
`;
|
|
44
|
+
|
|
21
45
|
exports[`renders LoginDrawer open unchanged 1`] = `
|
|
22
46
|
<div>
|
|
23
47
|
<div
|
|
@@ -1558,6 +1558,7 @@ const MemoriWidget = ({
|
|
|
1558
1558
|
// }
|
|
1559
1559
|
}
|
|
1560
1560
|
|
|
1561
|
+
// https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts
|
|
1561
1562
|
switch (voiceLang) {
|
|
1562
1563
|
case 'IT':
|
|
1563
1564
|
voice = `${
|
|
@@ -1609,6 +1610,11 @@ const MemoriWidget = ({
|
|
|
1609
1610
|
voiceType === 'MALE' ? 'fi-FI-HarriNeural' : 'fi-FI-SelmaNeural'
|
|
1610
1611
|
}`;
|
|
1611
1612
|
break;
|
|
1613
|
+
case 'EL':
|
|
1614
|
+
voice = `${
|
|
1615
|
+
voiceType === 'MALE' ? 'el-GR-NestorasNeural' : 'el-GR-AthinaNeural'
|
|
1616
|
+
}`;
|
|
1617
|
+
break;
|
|
1612
1618
|
default:
|
|
1613
1619
|
voice = `${
|
|
1614
1620
|
voiceType === 'MALE' ? 'it-IT-DiegoNeural' : 'it-IT-IsabellaNeural'
|
|
@@ -1665,6 +1671,9 @@ const MemoriWidget = ({
|
|
|
1665
1671
|
case 'FI':
|
|
1666
1672
|
voice = 'fi-FI';
|
|
1667
1673
|
break;
|
|
1674
|
+
case 'EL':
|
|
1675
|
+
voice = 'el-GR';
|
|
1676
|
+
break;
|
|
1668
1677
|
default:
|
|
1669
1678
|
voice = 'it-IT';
|
|
1670
1679
|
break;
|
|
@@ -2229,6 +2238,11 @@ const MemoriWidget = ({
|
|
|
2229
2238
|
? true
|
|
2230
2239
|
: integrationConfig?.showAIicon;
|
|
2231
2240
|
|
|
2241
|
+
const showWhyThisAnswer =
|
|
2242
|
+
integrationConfig?.showWhyThisAnswer === undefined
|
|
2243
|
+
? true
|
|
2244
|
+
: integrationConfig?.showWhyThisAnswer;
|
|
2245
|
+
|
|
2232
2246
|
// eslint-disable-next-line
|
|
2233
2247
|
const [avatar3dVisible, setAvatar3dVisible] = useState(false);
|
|
2234
2248
|
useEffect(() => {
|
|
@@ -2924,6 +2938,7 @@ const MemoriWidget = ({
|
|
|
2924
2938
|
showDates,
|
|
2925
2939
|
showContextPerLine,
|
|
2926
2940
|
showAIicon,
|
|
2941
|
+
showWhyThisAnswer,
|
|
2927
2942
|
client,
|
|
2928
2943
|
selectReceiverTag,
|
|
2929
2944
|
preview,
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
import SignupForm from './SignupForm';
|
|
4
|
+
import { tenant } from '../../mocks/data';
|
|
5
|
+
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
window.IntersectionObserver = jest.fn(() => ({
|
|
9
|
+
observe: jest.fn(),
|
|
10
|
+
unobserve: jest.fn(),
|
|
11
|
+
disconnect: jest.fn(),
|
|
12
|
+
takeRecords: jest.fn(),
|
|
13
|
+
}));
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('renders SignupForm unchanged', () => {
|
|
17
|
+
const { container } = render(
|
|
18
|
+
<SignupForm
|
|
19
|
+
apiUrl="https://backend.memori.ai"
|
|
20
|
+
tenant={tenant}
|
|
21
|
+
onLogin={jest.fn()}
|
|
22
|
+
goToLogin={jest.fn()}
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
expect(container).toMatchSnapshot();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('renders SignupForm on otp form unchanged', () => {
|
|
29
|
+
const { container } = render(
|
|
30
|
+
<SignupForm
|
|
31
|
+
apiUrl="https://backend.memori.ai"
|
|
32
|
+
tenant={tenant}
|
|
33
|
+
onLogin={jest.fn()}
|
|
34
|
+
goToLogin={jest.fn()}
|
|
35
|
+
__TEST__waitingForOtp
|
|
36
|
+
/>
|
|
37
|
+
);
|
|
38
|
+
expect(container).toMatchSnapshot();
|
|
39
|
+
});
|