From a53961b23508ddc77ade94dac439229da63cd69e Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 10:21:46 +0000 Subject: [PATCH 01/10] fix: correct reset password link in email --- packages/backend/src/graphql/mutations/forgot-password.ee.ts | 2 ++ .../backend/src/views/emails/reset-password-instructions.ee.hbs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/graphql/mutations/forgot-password.ee.ts b/packages/backend/src/graphql/mutations/forgot-password.ee.ts index 0d0ef97f..045ee704 100644 --- a/packages/backend/src/graphql/mutations/forgot-password.ee.ts +++ b/packages/backend/src/graphql/mutations/forgot-password.ee.ts @@ -1,3 +1,4 @@ +import appConfig from '../../config/app'; import User from '../../models/user'; import emailQueue from '../../queues/email'; import { @@ -30,6 +31,7 @@ const forgotPassword = async (_parent: unknown, params: Params) => { template: 'reset-password-instructions', params: { token: user.resetPasswordToken, + webAppUrl: appConfig.webAppUrl, }, }; diff --git a/packages/backend/src/views/emails/reset-password-instructions.ee.hbs b/packages/backend/src/views/emails/reset-password-instructions.ee.hbs index 1fb678f4..5cc7d582 100644 --- a/packages/backend/src/views/emails/reset-password-instructions.ee.hbs +++ b/packages/backend/src/views/emails/reset-password-instructions.ee.hbs @@ -8,7 +8,7 @@ Someone has requested a link to change your password, and you can do this through the link below. - Change my password + Change my password If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one. From f094da6a4b18c38356d7f493deccc66f6376f170 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 14:36:19 +0000 Subject: [PATCH 02/10] feat: add spacing in reset password email template --- .../emails/reset-password-instructions.ee.hbs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/views/emails/reset-password-instructions.ee.hbs b/packages/backend/src/views/emails/reset-password-instructions.ee.hbs index 5cc7d582..97c69934 100644 --- a/packages/backend/src/views/emails/reset-password-instructions.ee.hbs +++ b/packages/backend/src/views/emails/reset-password-instructions.ee.hbs @@ -1,16 +1,23 @@ - Title + Reset password instructions - Hello {{ email }} +

+ Hello {{ email }}, +

- Someone has requested a link to change your password, and you can do this through the link below. +

+ Someone has requested a link to change your password, and you can do this through the link below. +

+

Change my password +

- If you didn't request this, please ignore this email. - Your password won't change until you access the link above and create a new one. +

+ If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one. +

From d198eaa9880e65f568497c848d79440c9ccdb5ae Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 14:37:42 +0000 Subject: [PATCH 03/10] fix: correct template name in email worker --- packages/backend/src/workers/email.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/workers/email.ts b/packages/backend/src/workers/email.ts index d8ff037c..953f9c41 100644 --- a/packages/backend/src/workers/email.ts +++ b/packages/backend/src/workers/email.ts @@ -8,13 +8,13 @@ import appConfig from '../config/app'; export const worker = new Worker( 'email', async (job) => { - const { email, subject, templateName, params } = job.data; + const { email, subject, template, params } = job.data; await mailer.sendMail({ to: email, from: appConfig.fromEmail, subject: subject, - html: compileEmail(templateName, params), + html: compileEmail(template, params), }); }, { connection: redisConfig } From cc05bc7db8fc8f2af9a925b79a88555dd6e085d0 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 14:38:18 +0000 Subject: [PATCH 04/10] feat: expose email address in email templates --- packages/backend/src/workers/email.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/workers/email.ts b/packages/backend/src/workers/email.ts index 953f9c41..8e414b14 100644 --- a/packages/backend/src/workers/email.ts +++ b/packages/backend/src/workers/email.ts @@ -10,11 +10,16 @@ export const worker = new Worker( async (job) => { const { email, subject, template, params } = job.data; + const emailTemplateParams = { + ...params, + email, + } + await mailer.sendMail({ to: email, from: appConfig.fromEmail, subject: subject, - html: compileEmail(template, params), + html: compileEmail(template, emailTemplateParams), }); }, { connection: redisConfig } From 4792853eb65bc3562a27b9b04533754af6c70ed6 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 14:38:54 +0000 Subject: [PATCH 05/10] feat: add forgot password page --- .../graphql/mutations/forgot-password.ee.ts | 2 +- .../DeleteAccountDialog/index.ee.tsx | 4 +- .../ForgotPasswordForm/index.ee.tsx | 68 +++++++++++++++++++ .../web/src/components/LoginForm/index.tsx | 13 +++- packages/web/src/config/urls.ts | 1 + .../graphql/mutations/forgot-password.ee.ts | 7 ++ packages/web/src/locales/en.json | 9 ++- .../web/src/pages/ForgotPassword/index.ee.tsx | 14 ++++ packages/web/src/routes.tsx | 10 +++ 9 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 packages/web/src/components/ForgotPasswordForm/index.ee.tsx create mode 100644 packages/web/src/graphql/mutations/forgot-password.ee.ts create mode 100644 packages/web/src/pages/ForgotPassword/index.ee.tsx diff --git a/packages/backend/src/graphql/mutations/forgot-password.ee.ts b/packages/backend/src/graphql/mutations/forgot-password.ee.ts index 045ee704..dab887b0 100644 --- a/packages/backend/src/graphql/mutations/forgot-password.ee.ts +++ b/packages/backend/src/graphql/mutations/forgot-password.ee.ts @@ -42,7 +42,7 @@ const forgotPassword = async (_parent: unknown, params: Params) => { await emailQueue.add(jobName, jobPayload, jobOptions); - return; + return true; }; export default forgotPassword; diff --git a/packages/web/src/components/DeleteAccountDialog/index.ee.tsx b/packages/web/src/components/DeleteAccountDialog/index.ee.tsx index 59b9f308..d7310de5 100644 --- a/packages/web/src/components/DeleteAccountDialog/index.ee.tsx +++ b/packages/web/src/components/DeleteAccountDialog/index.ee.tsx @@ -15,11 +15,11 @@ import useAuthentication from 'hooks/useAuthentication'; import useFormatMessage from 'hooks/useFormatMessage'; import useCurrentUser from 'hooks/useCurrentUser'; -type TDeleteAccountDialogProps = { +type DeleteAccountDialogProps = { onClose: () => void; } -export default function DeleteAccountDialog(props: TDeleteAccountDialogProps) { +export default function DeleteAccountDialog(props: DeleteAccountDialogProps) { const [deleteUser] = useMutation(DELETE_USER); const formatMessage = useFormatMessage(); const currentUser = useCurrentUser(); diff --git a/packages/web/src/components/ForgotPasswordForm/index.ee.tsx b/packages/web/src/components/ForgotPasswordForm/index.ee.tsx new file mode 100644 index 00000000..2fb21a05 --- /dev/null +++ b/packages/web/src/components/ForgotPasswordForm/index.ee.tsx @@ -0,0 +1,68 @@ +import * as React from 'react'; +import { useMutation } from '@apollo/client'; +import Paper from '@mui/material/Paper'; +import Typography from '@mui/material/Typography'; +import LoadingButton from '@mui/lab/LoadingButton'; + +import { FORGOT_PASSWORD } from 'graphql/mutations/forgot-password.ee'; +import Form from 'components/Form'; +import TextField from 'components/TextField'; +import useFormatMessage from 'hooks/useFormatMessage'; + +export default function ForgotPasswordForm() { + const formatMessage = useFormatMessage(); + const [forgotPassword, { data, loading }] = useMutation(FORGOT_PASSWORD); + + const handleSubmit = async (values: any) => { + await forgotPassword({ + variables: { + input: values, + }, + }); + }; + + return ( + + theme.palette.text.disabled, + pb: 2, + mb: 2, + }} + gutterBottom + > + {formatMessage('forgotPassword.title')} + + +
+ + + + {formatMessage('forgotPassword.submit')} + + + {data && theme.palette.success.main }}> + {formatMessage('forgotPassword.instructionsSent')} + } + +
+ ); +} diff --git a/packages/web/src/components/LoginForm/index.tsx b/packages/web/src/components/LoginForm/index.tsx index fab8fae2..d6a82a8e 100644 --- a/packages/web/src/components/LoginForm/index.tsx +++ b/packages/web/src/components/LoginForm/index.tsx @@ -11,6 +11,7 @@ import * as URLS from 'config/urls'; import { LOGIN } from 'graphql/mutations/login'; import Form from 'components/Form'; import TextField from 'components/TextField'; +import useFormatMessage from 'hooks/useFormatMessage'; function renderFields(props: { loading: boolean }) { const { loading = false } = props; @@ -37,8 +38,17 @@ function renderFields(props: { loading: boolean }) { margin="dense" autoComplete="current-password" data-test="password-text-field" + sx={{ mb: 1 }} /> + + Forgot password? + + - Login + {formatMessage('loginForm.title')}
diff --git a/packages/web/src/config/urls.ts b/packages/web/src/config/urls.ts index 062d88f4..be5e5ef7 100644 --- a/packages/web/src/config/urls.ts +++ b/packages/web/src/config/urls.ts @@ -6,6 +6,7 @@ export const EXECUTION = (executionId: string): string => export const LOGIN = '/login'; export const SIGNUP = '/sign-up'; +export const FORGOT_PASSWORD = '/forgot-password'; export const APPS = '/apps'; export const NEW_APP_CONNECTION = '/apps/new'; diff --git a/packages/web/src/graphql/mutations/forgot-password.ee.ts b/packages/web/src/graphql/mutations/forgot-password.ee.ts new file mode 100644 index 00000000..9373875e --- /dev/null +++ b/packages/web/src/graphql/mutations/forgot-password.ee.ts @@ -0,0 +1,7 @@ +import { gql } from '@apollo/client'; + +export const FORGOT_PASSWORD = gql` + mutation ForgotPassword($input: ForgotPasswordInput) { + forgotPassword(input: $input) + } +`; diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 22afbb8e..381839d1 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -113,5 +113,10 @@ "signupForm.confirmPasswordFieldLabel": "Confirm password", "signupForm.submit": "Sign up", "signupForm.passwordMustMatch": "Passwords must match.", - "signupForm.mandatoryInput": "{inputName} is required." -} + "signupForm.mandatoryInput": "{inputName} is required.", + "loginForm.title": "Login", + "forgotPassword.title": "Forgot password", + "forgotPassword.submit": "Send reset instructions", + "forgotPassword.instructionsSent": "The instructions have been sent!", + "forgotPassword.emailFieldLabel": "Email" +} \ No newline at end of file diff --git a/packages/web/src/pages/ForgotPassword/index.ee.tsx b/packages/web/src/pages/ForgotPassword/index.ee.tsx new file mode 100644 index 00000000..42e7093c --- /dev/null +++ b/packages/web/src/pages/ForgotPassword/index.ee.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Container from 'components/Container'; +import ForgotPasswordForm from 'components/ForgotPasswordForm/index.ee'; + +export default function Login(): React.ReactElement { + return ( + + + + + + ); +} diff --git a/packages/web/src/routes.tsx b/packages/web/src/routes.tsx index 5120663c..2147cd95 100644 --- a/packages/web/src/routes.tsx +++ b/packages/web/src/routes.tsx @@ -9,6 +9,7 @@ import Flows from 'pages/Flows'; import Flow from 'pages/Flow'; import Login from 'pages/Login'; import SignUp from 'pages/SignUp/index.ee'; +import ForgotPassword from 'pages/ForgotPassword/index.ee'; import EditorRoutes from 'pages/Editor/routes'; import * as URLS from 'config/urls'; import settingsRoutes from './settingsRoutes'; @@ -90,6 +91,15 @@ export default ( } /> + + + + } + /> + Date: Fri, 3 Mar 2023 14:42:47 +0000 Subject: [PATCH 06/10] feat: add translations in login form --- .../web/src/components/LoginForm/index.tsx | 112 ++++++++---------- packages/web/src/locales/en.json | 4 + 2 files changed, 54 insertions(+), 62 deletions(-) diff --git a/packages/web/src/components/LoginForm/index.tsx b/packages/web/src/components/LoginForm/index.tsx index d6a82a8e..8e13a451 100644 --- a/packages/web/src/components/LoginForm/index.tsx +++ b/packages/web/src/components/LoginForm/index.tsx @@ -13,65 +13,6 @@ import Form from 'components/Form'; import TextField from 'components/TextField'; import useFormatMessage from 'hooks/useFormatMessage'; -function renderFields(props: { loading: boolean }) { - const { loading = false } = props; - - return () => { - return ( - <> - - - - - - Forgot password? - - - - Login - - - - Don't have an Automatisch account yet?  - - Sign up - - - - ); - }; -} - function LoginForm() { const navigate = useNavigate(); const formatMessage = useFormatMessage(); @@ -96,8 +37,6 @@ function LoginForm() { authentication.updateToken(token); }; - const render = React.useMemo(() => renderFields({ loading }), [loading]); - return ( - + + + + + + + {formatMessage('loginForm.forgotPasswordText')} + + + + {formatMessage('loginForm.submit')} + + + + Don't have an Automatisch account yet?  + + Sign up + + + ); } diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 381839d1..896be4d2 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -115,6 +115,10 @@ "signupForm.passwordMustMatch": "Passwords must match.", "signupForm.mandatoryInput": "{inputName} is required.", "loginForm.title": "Login", + "loginForm.emailFieldLabel": "Email", + "loginForm.passwordFieldLabel": "Password", + "loginForm.forgotPasswordText": "Forgot password?", + "loginForm.submit": "Login", "forgotPassword.title": "Forgot password", "forgotPassword.submit": "Send reset instructions", "forgotPassword.instructionsSent": "The instructions have been sent!", From 7d9f624805149513bbdae7f5e6bf3c4a8eafb65a Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 18:15:49 +0000 Subject: [PATCH 07/10] feat: add translations for sign up CTA in login --- packages/web/src/components/LoginForm/index.tsx | 5 +++-- packages/web/src/locales/en.json | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/web/src/components/LoginForm/index.tsx b/packages/web/src/components/LoginForm/index.tsx index 8e13a451..7070da10 100644 --- a/packages/web/src/components/LoginForm/index.tsx +++ b/packages/web/src/components/LoginForm/index.tsx @@ -97,9 +97,10 @@ function LoginForm() {
- Don't have an Automatisch account yet?  + {formatMessage('loginForm.noAccount')} +   - Sign up + {formatMessage('loginForm.signUp')} diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 896be4d2..32221d33 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -119,6 +119,8 @@ "loginForm.passwordFieldLabel": "Password", "loginForm.forgotPasswordText": "Forgot password?", "loginForm.submit": "Login", + "loginForm.noAccount": "Don't have an Automatisch account yet?", + "loginForm.signUp": "Sign up", "forgotPassword.title": "Forgot password", "forgotPassword.submit": "Send reset instructions", "forgotPassword.instructionsSent": "The instructions have been sent!", From 5762cf5dc54bba4156b71dea49c20acffc21b792 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 20:09:37 +0000 Subject: [PATCH 08/10] fix: make resetMutation public --- packages/backend/src/graphql/mutations/reset-password.ee.ts | 2 +- packages/backend/src/helpers/authentication.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/graphql/mutations/reset-password.ee.ts b/packages/backend/src/graphql/mutations/reset-password.ee.ts index c8a350bc..d68fc55a 100644 --- a/packages/backend/src/graphql/mutations/reset-password.ee.ts +++ b/packages/backend/src/graphql/mutations/reset-password.ee.ts @@ -24,7 +24,7 @@ const resetPassword = async (_parent: unknown, params: Params) => { await user.resetPassword(password); - return; + return true; }; export default resetPassword; diff --git a/packages/backend/src/helpers/authentication.ts b/packages/backend/src/helpers/authentication.ts index c1368e0a..e746d452 100644 --- a/packages/backend/src/helpers/authentication.ts +++ b/packages/backend/src/helpers/authentication.ts @@ -31,6 +31,7 @@ const authentication = shield( login: allow, createUser: allow, forgotPassword: allow, + resetPassword: allow, }, }, { From fa867387d477882a1a42c01cb88153b3e4c9807d Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 3 Mar 2023 20:13:31 +0000 Subject: [PATCH 09/10] feat: add reset password page --- .../ForgotPasswordForm/index.ee.tsx | 8 +- .../components/ResetPasswordForm/index.ee.tsx | 122 ++++++++++++++++++ .../src/components/SignUpForm/index.ee.tsx | 4 +- packages/web/src/config/urls.ts | 1 + .../graphql/mutations/reset-password.ee.ts | 7 + packages/web/src/locales/en.json | 17 ++- .../web/src/pages/ForgotPassword/index.ee.tsx | 2 +- .../web/src/pages/ResetPassword/index.ee.tsx | 14 ++ packages/web/src/routes.tsx | 10 ++ 9 files changed, 173 insertions(+), 12 deletions(-) create mode 100644 packages/web/src/components/ResetPasswordForm/index.ee.tsx create mode 100644 packages/web/src/graphql/mutations/reset-password.ee.ts create mode 100644 packages/web/src/pages/ResetPassword/index.ee.tsx diff --git a/packages/web/src/components/ForgotPasswordForm/index.ee.tsx b/packages/web/src/components/ForgotPasswordForm/index.ee.tsx index 2fb21a05..69b362d8 100644 --- a/packages/web/src/components/ForgotPasswordForm/index.ee.tsx +++ b/packages/web/src/components/ForgotPasswordForm/index.ee.tsx @@ -34,12 +34,12 @@ export default function ForgotPasswordForm() { }} gutterBottom > - {formatMessage('forgotPassword.title')} + {formatMessage('forgotPasswordForm.title')}
- {formatMessage('forgotPassword.submit')} + {formatMessage('forgotPasswordForm.submit')} {data && theme.palette.success.main }}> - {formatMessage('forgotPassword.instructionsSent')} + {formatMessage('forgotPasswordForm.instructionsSent')} } diff --git a/packages/web/src/components/ResetPasswordForm/index.ee.tsx b/packages/web/src/components/ResetPasswordForm/index.ee.tsx new file mode 100644 index 00000000..3ec40073 --- /dev/null +++ b/packages/web/src/components/ResetPasswordForm/index.ee.tsx @@ -0,0 +1,122 @@ +import * as React from 'react'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { useMutation } from '@apollo/client'; +import Paper from '@mui/material/Paper'; +import Typography from '@mui/material/Typography'; +import LoadingButton from '@mui/lab/LoadingButton'; +import { useSnackbar } from 'notistack'; +import * as yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; + +import * as URLS from 'config/urls'; +import Form from 'components/Form'; +import TextField from 'components/TextField'; +import useFormatMessage from 'hooks/useFormatMessage'; +import { RESET_PASSWORD } from 'graphql/mutations/reset-password.ee'; + +const validationSchema = yup.object().shape({ + password: yup.string().required('resetPasswordForm.mandatoryInput'), + confirmPassword: yup + .string() + .required('resetPasswordForm.mandatoryInput') + .oneOf([yup.ref('password')], 'resetPasswordForm.passwordsMustMatch'), +}); + +export default function ResetPasswordForm() { + const { enqueueSnackbar } = useSnackbar(); + const formatMessage = useFormatMessage(); + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const [resetPassword, { data, loading }] = useMutation(RESET_PASSWORD); + + const token = searchParams.get('token'); + + const handleSubmit = async (values: any) => { + await resetPassword({ + variables: { + input: { + password: values.password, + token, + }, + }, + }); + + enqueueSnackbar(formatMessage('resetPasswordForm.passwordUpdated'), { variant: 'success' }); + + navigate(URLS.LOGIN); + }; + + return ( + + theme.palette.text.disabled, + pb: 2, + mb: 2, + }} + gutterBottom + > + {formatMessage('resetPasswordForm.title')} + + +
( + <> + + + + + + {formatMessage('resetPasswordForm.submit')} + + + )} + /> + + ); +} diff --git a/packages/web/src/components/SignUpForm/index.ee.tsx b/packages/web/src/components/SignUpForm/index.ee.tsx index eb7a55f6..9c14c5e5 100644 --- a/packages/web/src/components/SignUpForm/index.ee.tsx +++ b/packages/web/src/components/SignUpForm/index.ee.tsx @@ -5,13 +5,13 @@ import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import LoadingButton from '@mui/lab/LoadingButton'; import * as yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; import useAuthentication from 'hooks/useAuthentication'; import * as URLS from 'config/urls'; import { CREATE_USER } from 'graphql/mutations/create-user.ee'; import Form from 'components/Form'; import TextField from 'components/TextField'; -import { yupResolver } from '@hookform/resolvers/yup'; import { LOGIN } from 'graphql/mutations/login'; import useFormatMessage from 'hooks/useFormatMessage'; @@ -22,7 +22,7 @@ const validationSchema = yup.object().shape({ confirmPassword: yup .string() .required('signupForm.mandatoryInput') - .oneOf([yup.ref('password')], 'signupForm.passwordMustMatch'), + .oneOf([yup.ref('password')], 'signupForm.passwordsMustMatch'), }); const initialValues = { diff --git a/packages/web/src/config/urls.ts b/packages/web/src/config/urls.ts index be5e5ef7..5500a6ab 100644 --- a/packages/web/src/config/urls.ts +++ b/packages/web/src/config/urls.ts @@ -7,6 +7,7 @@ export const EXECUTION = (executionId: string): string => export const LOGIN = '/login'; export const SIGNUP = '/sign-up'; export const FORGOT_PASSWORD = '/forgot-password'; +export const RESET_PASSWORD = '/reset-password'; export const APPS = '/apps'; export const NEW_APP_CONNECTION = '/apps/new'; diff --git a/packages/web/src/graphql/mutations/reset-password.ee.ts b/packages/web/src/graphql/mutations/reset-password.ee.ts new file mode 100644 index 00000000..aaf991f6 --- /dev/null +++ b/packages/web/src/graphql/mutations/reset-password.ee.ts @@ -0,0 +1,7 @@ +import { gql } from '@apollo/client'; + +export const RESET_PASSWORD = gql` + mutation ResetPassword($input: ResetPasswordInput) { + resetPassword(input: $input) + } +`; diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 32221d33..87192f13 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -112,7 +112,7 @@ "signupForm.passwordFieldLabel": "Password", "signupForm.confirmPasswordFieldLabel": "Confirm password", "signupForm.submit": "Sign up", - "signupForm.passwordMustMatch": "Passwords must match.", + "signupForm.passwordsMustMatch": "Passwords must match.", "signupForm.mandatoryInput": "{inputName} is required.", "loginForm.title": "Login", "loginForm.emailFieldLabel": "Email", @@ -121,8 +121,15 @@ "loginForm.submit": "Login", "loginForm.noAccount": "Don't have an Automatisch account yet?", "loginForm.signUp": "Sign up", - "forgotPassword.title": "Forgot password", - "forgotPassword.submit": "Send reset instructions", - "forgotPassword.instructionsSent": "The instructions have been sent!", - "forgotPassword.emailFieldLabel": "Email" + "forgotPasswordForm.title": "Forgot password", + "forgotPasswordForm.submit": "Send reset instructions", + "forgotPasswordForm.instructionsSent": "The instructions have been sent!", + "forgotPasswordForm.emailFieldLabel": "Email", + "resetPasswordForm.passwordsMustMatch": "Passwords must match.", + "resetPasswordForm.mandatoryInput": "{inputName} is required.", + "resetPasswordForm.title": "Reset password", + "resetPasswordForm.submit": "Reset password", + "resetPasswordForm.passwordFieldLabel": "Password", + "resetPasswordForm.confirmPasswordFieldLabel": "Confirm password", + "resetPasswordForm.passwordUpdated": "The password has been updated. Now, you can login." } \ No newline at end of file diff --git a/packages/web/src/pages/ForgotPassword/index.ee.tsx b/packages/web/src/pages/ForgotPassword/index.ee.tsx index 42e7093c..4b75e703 100644 --- a/packages/web/src/pages/ForgotPassword/index.ee.tsx +++ b/packages/web/src/pages/ForgotPassword/index.ee.tsx @@ -3,7 +3,7 @@ import Box from '@mui/material/Box'; import Container from 'components/Container'; import ForgotPasswordForm from 'components/ForgotPasswordForm/index.ee'; -export default function Login(): React.ReactElement { +export default function ForgotPassword(): React.ReactElement { return ( diff --git a/packages/web/src/pages/ResetPassword/index.ee.tsx b/packages/web/src/pages/ResetPassword/index.ee.tsx new file mode 100644 index 00000000..eb41213e --- /dev/null +++ b/packages/web/src/pages/ResetPassword/index.ee.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Container from 'components/Container'; +import ResetPasswordForm from 'components/ResetPasswordForm/index.ee'; + +export default function ResetPassword(): React.ReactElement { + return ( + + + + + + ); +} diff --git a/packages/web/src/routes.tsx b/packages/web/src/routes.tsx index 2147cd95..c06b8467 100644 --- a/packages/web/src/routes.tsx +++ b/packages/web/src/routes.tsx @@ -10,6 +10,7 @@ import Flow from 'pages/Flow'; import Login from 'pages/Login'; import SignUp from 'pages/SignUp/index.ee'; import ForgotPassword from 'pages/ForgotPassword/index.ee'; +import ResetPassword from 'pages/ResetPassword/index.ee'; import EditorRoutes from 'pages/Editor/routes'; import * as URLS from 'config/urls'; import settingsRoutes from './settingsRoutes'; @@ -100,6 +101,15 @@ export default ( } /> + + + + } + /> + Date: Sun, 5 Mar 2023 09:18:07 +0000 Subject: [PATCH 10/10] feat: use full name instead of email address in emails --- .../backend/src/graphql/mutations/forgot-password.ee.ts | 1 + .../src/views/emails/reset-password-instructions.ee.hbs | 2 +- packages/backend/src/workers/email.ts | 7 +------ 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/graphql/mutations/forgot-password.ee.ts b/packages/backend/src/graphql/mutations/forgot-password.ee.ts index dab887b0..5e28a429 100644 --- a/packages/backend/src/graphql/mutations/forgot-password.ee.ts +++ b/packages/backend/src/graphql/mutations/forgot-password.ee.ts @@ -32,6 +32,7 @@ const forgotPassword = async (_parent: unknown, params: Params) => { params: { token: user.resetPasswordToken, webAppUrl: appConfig.webAppUrl, + fullName: user.fullName, }, }; diff --git a/packages/backend/src/views/emails/reset-password-instructions.ee.hbs b/packages/backend/src/views/emails/reset-password-instructions.ee.hbs index 97c69934..8397c863 100644 --- a/packages/backend/src/views/emails/reset-password-instructions.ee.hbs +++ b/packages/backend/src/views/emails/reset-password-instructions.ee.hbs @@ -5,7 +5,7 @@

- Hello {{ email }}, + Hello {{ fullName }},

diff --git a/packages/backend/src/workers/email.ts b/packages/backend/src/workers/email.ts index 8e414b14..953f9c41 100644 --- a/packages/backend/src/workers/email.ts +++ b/packages/backend/src/workers/email.ts @@ -10,16 +10,11 @@ export const worker = new Worker( async (job) => { const { email, subject, template, params } = job.data; - const emailTemplateParams = { - ...params, - email, - } - await mailer.sendMail({ to: email, from: appConfig.fromEmail, subject: subject, - html: compileEmail(template, emailTemplateParams), + html: compileEmail(template, params), }); }, { connection: redisConfig }