From d23e02adca8e0c6c65ac7e518e3d7aaa32d1e7fa Mon Sep 17 00:00:00 2001 From: bosiraphael <71827178+bosiraphael@users.noreply.github.com> Date: Thu, 25 Apr 2024 15:32:55 +0200 Subject: [PATCH] 4001 add validation for blocklist (#5172) Closes #4001 --- .../SettingsAccountsEmailsBlocklistInput.tsx | 94 +++++++++++++------ .../ui/input/button/components/Button.tsx | 2 +- .../workspace-pre-query-hook.config.ts | 4 + .../workspace-pre-query-hook.module.ts | 7 +- .../workspace-query-runner.service.ts | 8 ++ .../src/engine/utils/is-domain.ts | 5 + .../blocklist-create-many.pre-query.hook.ts | 46 +++++++++ .../connected-account-query-hook.module.ts | 14 +++ 8 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 packages/twenty-server/src/engine/utils/is-domain.ts create mode 100644 packages/twenty-server/src/modules/connected-account/query-hooks/blocklist/blocklist-create-many.pre-query.hook.ts create mode 100644 packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-query-hook.module.ts diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsEmailsBlocklistInput.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsEmailsBlocklistInput.tsx index 76b9f2204..87160ac12 100644 --- a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsEmailsBlocklistInput.tsx +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsEmailsBlocklistInput.tsx @@ -1,9 +1,13 @@ -import { useState } from 'react'; +import { useEffect } from 'react'; +import { Controller, useForm } from 'react-hook-form'; import styled from '@emotion/styled'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Key } from 'ts-key-enum'; +import { z } from 'zod'; import { Button } from '@/ui/input/button/components/Button'; import { TextInput } from '@/ui/input/components/TextInput'; +import { isDomain } from '~/utils/is-domain'; const StyledContainer = styled.div` display: flex; @@ -19,45 +23,75 @@ type SettingsAccountsEmailsBlocklistInputProps = { updateBlockedEmailList: (email: string) => void; }; +const validationSchema = z + .object({ + emailOrDomain: z + .string() + .trim() + .email('Invalid email or domain') + .or( + z + .string() + .refine( + (value) => value.startsWith('@') && isDomain(value.slice(1)), + 'Invalid email or domain', + ), + ), + }) + .required(); + +type FormInput = z.infer; + export const SettingsAccountsEmailsBlocklistInput = ({ updateBlockedEmailList, }: SettingsAccountsEmailsBlocklistInputProps) => { - const [formValues, setFormValues] = useState<{ - email: string; - }>({ - email: '', + const { reset, handleSubmit, control, formState } = useForm({ + mode: 'onSubmit', + resolver: zodResolver(validationSchema), + defaultValues: { + emailOrDomain: '', + }, + }); + + const submit = handleSubmit((data) => { + updateBlockedEmailList(data.emailOrDomain); }); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === Key.Enter) { - updateBlockedEmailList(formValues.email); - setFormValues({ email: '' }); + submit(); } }; + const { isSubmitSuccessful } = formState; + + useEffect(() => { + if (isSubmitSuccessful) { + reset(); + } + }, [isSubmitSuccessful, reset]); + return ( - - - { - setFormValues((prevState) => ({ - ...prevState, - email: value, - })); - }} - fullWidth - onKeyDown={handleKeyDown} - /> - -