UNPKG

@memori.ai/memori-react

Version:

[![npm version](https://img.shields.io/github/package-json/v/memori-ai/memori-react)](https://www.npmjs.com/package/@memori.ai/memori-react) ![Tests](https://github.com/memori-ai/memori-react/workflows/CI/badge.svg?branch=main) ![TypeScript Support](https

209 lines 16.4 kB
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import { useState } from 'react'; import Button from '../ui/Button'; import Drawer from '../ui/Drawer'; import toast from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; import cx from 'classnames'; import { getErrori18nKey } from '../../helpers/error'; import { mailRegEx, pwdRegEx } from '../../helpers/utils'; import SignupForm from '../SignupForm/SignupForm'; import AccountForm from '../AccountForm/AccountForm'; const LoginDrawer = ({ open = false, onClose, onLogin, onLogout, user, loginToken, tenant, apiClient, __TEST__signup = false, __TEST__needMissingData = false, __TEST__waitingForOtp = false, __TEST__changePwd = false, }) => { var _a, _b; const { t, i18n } = useTranslation(); const lang = i18n.language === 'it' ? 'it' : 'en'; const { userLogin, updateUser } = apiClient.backend; const isUserLoggedIn = (user === null || user === void 0 ? void 0 : user.userID) && loginToken; const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [showSignup, setShowSignup] = useState(__TEST__signup); const [userMustChangePwd, setUserMustChangePwd] = useState(__TEST__changePwd ? { flowID: 'flowID', tenant: tenant.name, eMail: 'email', userName: 'username', password: 'password', } : undefined); const [needsMissingData, setNeedsMissingData] = useState(__TEST__needMissingData ? { token: 'token', birthDate: true, tnCAndPPAccepted: true, } : {}); const login = (e) => { e.preventDefault(); const form = e.currentTarget; const userNameOrEmail = form.userNameOrEmail.value; const password = form.password.value; const isEmail = mailRegEx.test(userNameOrEmail); const user = isEmail ? { tenant: tenant === null || tenant === void 0 ? void 0 : tenant.name, eMail: userNameOrEmail, password: password, } : { tenant: tenant === null || tenant === void 0 ? void 0 : tenant.name, userName: userNameOrEmail, password: password, }; setLoading(true); setError(null); userLogin(user) .then(data => { var _a, _b, _c, _d, _e; if (data.resultCode === -14) { setUserMustChangePwd({ tenant: tenant.name, eMail: isEmail ? userNameOrEmail : undefined, userName: isEmail ? undefined : userNameOrEmail, password: password, flowID: (data.flowID || ((_a = data.user) === null || _a === void 0 ? void 0 : _a.flowID)), }); } else if (data.resultCode !== 0) { console.error(data); toast.error(t(getErrori18nKey(data.resultCode))); setError(data.resultMessage); } else if (data.user && data.token) { if (!((_b = data.user) === null || _b === void 0 ? void 0 : _b.tnCAndPPAccepted) || !((_c = data.user) === null || _c === void 0 ? void 0 : _c.birthDate)) { setNeedsMissingData({ token: data.token, birthDate: !((_d = data.user) === null || _d === void 0 ? void 0 : _d.birthDate), tnCAndPPAccepted: !((_e = data.user) === null || _e === void 0 ? void 0 : _e.tnCAndPPAccepted), }); } else { onLogin(data.user, data.token); } } }) .catch(err => { console.error('[LOGIN]', err); if (err.message) { toast.error(err.message); setError(err.message); } }) .finally(() => { setLoading(false); }); }; const updateMissingData = async (e) => { var _a, _b, _c; e.preventDefault(); const form = e.currentTarget; const birthDate = (_a = form.birthDate) === null || _a === void 0 ? void 0 : _a.value; const tnCAndPPAccepted = (_b = form.tnCAndPPAccepted) === null || _b === void 0 ? void 0 : _b.checked; const pAndCUAccepted = (_c = form.pAndCUAccepted) === null || _c === void 0 ? void 0 : _c.checked; if (!(user === null || user === void 0 ? void 0 : user.userID) || !(needsMissingData === null || needsMissingData === void 0 ? void 0 : needsMissingData.token)) { return; } if (!birthDate || !tnCAndPPAccepted) { setError(t('missingData')); return; } let newUser = { userID: user.userID, birthDate: (user === null || user === void 0 ? void 0 : user.birthDate) || !needsMissingData.birthDate ? undefined : birthDate, tnCAndPPAccepted: tnCAndPPAccepted || (user === null || user === void 0 ? void 0 : user.tnCAndPPAccepted), tnCAndPPAcceptanceDate: tnCAndPPAccepted ? new Date().toISOString() : undefined, pAndCUAccepted: pAndCUAccepted || (user === null || user === void 0 ? void 0 : user.pAndCUAccepted), pAndCUAcceptanceDate: pAndCUAccepted ? new Date().toISOString() : undefined, }; const { user: patchedUser, ...resp } = await updateUser(needsMissingData.token, user.userID, newUser); if (resp.resultCode !== 0) { console.error(resp); toast.error(t(getErrori18nKey(resp.resultCode))); setError(resp.resultMessage); } else { toast.success(t('success')); onLogin(patchedUser || newUser, needsMissingData.token); } }; const [password, setPassword] = useState(); const [confirmPassword, setConfirmPassword] = useState(); const pwdAcceptable = !password || (password && pwdRegEx.test(password)); const pwdGreen = pwdAcceptable && password && password.length >= 24; const pwdEmpty = !password || password.length === 0; const pwdMeterValue = !pwdAcceptable || pwdEmpty ? 0 : password.length < 8 ? 15 : password.length >= 32 ? 100 : (password.length - 8) * (50 / 24) + 50; const changePassword = async (e) => { var _a, _b, _c, _d, _e; e.preventDefault(); const form = e.currentTarget; const tenantID = (_a = form.tenant.value) !== null && _a !== void 0 ? _a : tenant.name; const flowID = (_b = form.flowID.value) !== null && _b !== void 0 ? _b : userMustChangePwd === null || userMustChangePwd === void 0 ? void 0 : userMustChangePwd.flowID; const eMail = (_c = form.eMail.value) !== null && _c !== void 0 ? _c : userMustChangePwd === null || userMustChangePwd === void 0 ? void 0 : userMustChangePwd.eMail; const userName = (_d = form.userName.value) !== null && _d !== void 0 ? _d : userMustChangePwd === null || userMustChangePwd === void 0 ? void 0 : userMustChangePwd.userName; const password = (_e = form.password.value) !== null && _e !== void 0 ? _e : userMustChangePwd === null || userMustChangePwd === void 0 ? void 0 : userMustChangePwd.password; const newPassword = form.newPassword.value; if (!(newPassword === null || newPassword === void 0 ? void 0 : newPassword.length) || !pwdAcceptable) { setError(t('login.passwordFormatError')); return; } setLoading(true); const user = { tenant: tenantID, flowID, eMail, userName, password, newPassword, }; try { const { user: patchedUser, token, ...resp } = await userLogin(user); if (resp.resultCode !== 0) { console.error(resp); toast.error(t(getErrori18nKey(resp.resultCode))); setError(resp.resultMessage); } else if (patchedUser && token) { toast.success(t('success')); onLogin(patchedUser || user, token); } } catch (e) { let err = e; console.error('[LOGIN/CHANGE PWD]', err); if (err.message) { toast.error(err.message); setError(err.message); } } finally { setLoading(false); } }; return (_jsx(Drawer, { open: open, onClose: onClose, className: cx('memori--login-drawer', { 'memori--login-drawer--logged': isUserLoggedIn, 'memori--login-drawer--signup': showSignup, }), title: _jsx("span", { className: "memori--login-drawer--title", children: isUserLoggedIn ? t('login.loggedDrawerTitle', { name: user.userName }) : showSignup ? t('login.signupDrawerTitle') : t('login.loginDrawerTitle') }), children: isUserLoggedIn ? (_jsxs("div", { className: "memori--login-drawer--logged", children: [user.avatarURL && (_jsx("figure", { className: "memori--login-drawer--avatar", children: _jsx("img", { src: user.avatarURL, alt: user.userName }) })), _jsx(Button, { primary: true, onClick: () => { onLogout(); }, children: t('login.logout') }), _jsx(AccountForm, { user: user, loginToken: loginToken, apiClient: apiClient, onUserUpdate: user => onLogin(user, loginToken) })] })) : ((_a = needsMissingData === null || needsMissingData === void 0 ? void 0 : needsMissingData.token) === null || _a === void 0 ? void 0 : _a.length) ? (_jsxs(_Fragment, { children: [_jsx("h3", { children: t('login.missingData') }), _jsx("p", { children: t('login.missingDataHelper') }), _jsxs("form", { className: "memori--login-drawer--form", onSubmit: updateMissingData, children: [needsMissingData.birthDate && (_jsxs(_Fragment, { children: [_jsxs("label", { htmlFor: "#birthDate", children: [t('login.birthDate'), _jsx("input", { id: "birthDate", name: "birthDate", type: "date", required: true, autoComplete: "bday" })] }), _jsx("p", { children: _jsx("small", { children: t('login.birthDateHelper') }) })] })), (needsMissingData === null || needsMissingData === void 0 ? void 0 : needsMissingData.tnCAndPPAccepted) && (_jsxs(_Fragment, { children: [_jsxs("label", { className: "memori-checkbox", children: [_jsxs("span", { className: "memori-checkbox--input-wrapper", children: [_jsx("input", { type: "checkbox", name: "tnCAndPPAccepted", className: "memori-checkbox--input" }), _jsx("span", { className: "memori-checkbox--inner" })] }), _jsxs("span", { className: "memori-checkbox--text", children: [t('login.privacyLabel'), ' ', _jsx("a", { href: `https://memori.ai/${lang}/privacy_and_cookie`, target: "_blank", rel: "noopener noreferrer", children: t('login.privacyAndCookiePolicy') }), ' ', t('login.and'), ' ', _jsx("a", { href: `https://memori.ai/${lang}/tos`, target: "_blank", rel: "noopener noreferrer", children: t('login.termsOfService') })] })] }), _jsxs("label", { className: "memori-checkbox", children: [_jsxs("span", { className: "memori-checkbox--input-wrapper", children: [_jsx("input", { type: "checkbox", name: "pAndCUAccepted", defaultChecked: user === null || user === void 0 ? void 0 : user.pAndCUAccepted, className: "memori-checkbox--input" }), _jsx("span", { className: "memori-checkbox--inner" })] }), _jsxs("span", { className: "memori-checkbox--text", children: [t('login.pAndCUAccepted'), ' ', _jsx("small", { children: _jsxs("em", { children: ["(", t('login.optional'), ")"] }) })] })] }), _jsx("p", { children: _jsx("small", { children: t('login.goToAccountToChangeYourPreferences') }) }), _jsx("p", { children: _jsx("small", { children: t('login.deepThoughtExplaination') }) })] })), _jsx(Button, { htmlType: "submit", primary: true, loading: loading, children: t('login.save') })] })] })) : (userMustChangePwd === null || userMustChangePwd === void 0 ? void 0 : userMustChangePwd.flowID) ? (_jsxs(_Fragment, { children: [_jsx("p", { children: t('login.mustChangePassword') }), _jsxs("form", { className: "memori--login-drawer--form", onSubmit: changePassword, children: [_jsx("input", { type: "hidden", name: "tenant", value: (_b = userMustChangePwd.tenant) !== null && _b !== void 0 ? _b : tenant === null || tenant === void 0 ? void 0 : tenant.name }), _jsx("input", { type: "hidden", name: "flowID", value: userMustChangePwd.flowID }), _jsx("input", { type: "hidden", name: "eMail", value: userMustChangePwd.eMail }), _jsx("input", { type: "hidden", name: "userName", value: userMustChangePwd.userName }), _jsx("input", { type: "hidden", name: "password", value: userMustChangePwd.password }), _jsxs("label", { htmlFor: "#newPassword", children: [t('login.password'), _jsx("input", { id: "newPassword", name: "newPassword", type: "password", required: true, autoComplete: "new-password", placeholder: t('login.password') || 'Password', onChange: e => setPassword(e.target.value), "aria-invalid": !pwdAcceptable })] }), !pwdAcceptable && (_jsx("p", { className: "memori--login-drawer--inline-error", children: t('login.passwordFormatError') })), _jsxs("label", { htmlFor: "#confirm-password", children: [t('login.confirmPassword'), _jsx("input", { id: "confirm-password", name: "confirmPassword", type: "password", required: true, autoComplete: "new-password", placeholder: t('login.confirmPassword') || 'Password', onChange: e => setConfirmPassword(e.target.value), "aria-invalid": !!(password === null || password === void 0 ? void 0 : password.length) && !!(confirmPassword === null || confirmPassword === void 0 ? void 0 : confirmPassword.length) && password !== confirmPassword })] }), !!(password === null || password === void 0 ? void 0 : password.length) && !!(confirmPassword === null || confirmPassword === void 0 ? void 0 : confirmPassword.length) && password !== confirmPassword && (_jsx("p", { className: "memori--login-drawer--inline-error", children: t('login.passwordMatchingError') })), _jsx("meter", { className: "memori--login-drawer--password-meter", min: 0, low: 33, high: 66, optimum: 80, max: 100, value: pwdMeterValue, id: "password-strength-meter" }), _jsx("small", { children: t(`login.pwd${pwdGreen ? 'Strong' : pwdAcceptable ? 'Acceptable' : 'Weak'}`) }), _jsx(Button, { htmlType: "submit", primary: true, loading: loading, children: t('confirm') })] })] })) : showSignup ? (_jsx(SignupForm, { tenant: tenant, apiClient: apiClient, onLogin: onLogin, goToLogin: () => setShowSignup(false), __TEST__waitingForOtp: __TEST__waitingForOtp })) : (_jsxs(_Fragment, { children: [_jsxs("form", { className: "memori--login-drawer--form", onSubmit: login, children: [_jsxs("label", { htmlFor: "#userNameOrEmail", children: [t('login.userNameOrEmail'), _jsx("input", { id: "userNameOrEmail", name: "userNameOrEmail", required: true, autoComplete: "email", placeholder: "Username/email" })] }), _jsxs("label", { htmlFor: "#password", children: ["Password", _jsx("input", { id: "password", name: "password", type: "password", required: true, autoComplete: "password", placeholder: "Password" })] }), _jsx(Button, { htmlType: "submit", primary: true, loading: loading, children: t('login.login') }), !(tenant === null || tenant === void 0 ? void 0 : tenant.disableRegistration) ? (_jsxs("p", { className: "memori--login-drawer--signup", children: [t('login.newUserSignUp'), ' ', _jsx(Button, { outlined: true, onClick: () => setShowSignup(true), children: t('login.signUp') })] })) : tenant.adminEmail ? (_jsxs("div", { className: "memori--login-drawer--signup", children: [_jsx("p", { children: t('login.registrationDisabled') }), _jsxs("p", { children: [t('login.contactAdmin'), ":", ' ', _jsx("a", { href: `mailto:${tenant.adminEmail}`, children: tenant.adminEmail })] })] })) : null] }), error && (_jsx("p", { role: "alert", className: "memori--login-drawer--error", children: error }))] })) })); }; export default LoginDrawer; //# sourceMappingURL=LoginDrawer.js.map