chore: exclude emails form field refactor (#17824)

* chore: exclude emails refactor

* Update
This commit is contained in:
Anik Dhabal Babu
2024-11-26 21:30:28 +05:30
committed by GitHub
parent 0e333aa71c
commit d8fd6f5c25
2 changed files with 38 additions and 30 deletions
+17 -8
View File
@@ -1,9 +1,9 @@
import { useAutoAnimate } from "@formkit/auto-animate/react";
import { zodResolver } from "@hookform/resolvers/zod";
import { useEffect, useState } from "react";
import type { SubmitHandler, UseFormReturn } from "react-hook-form";
import { Controller, useFieldArray, useForm, useFormContext } from "react-hook-form";
import type { z } from "zod";
import { ZodError } from "zod";
import { classNames } from "@calcom/lib";
import { useLocale } from "@calcom/lib/hooks/useLocale";
@@ -33,7 +33,7 @@ import {
import { fieldTypesConfigMap } from "./fieldTypes";
import { fieldsThatSupportLabelAsSafeHtml } from "./fieldsThatSupportLabelAsSafeHtml";
import { fieldSchema, type fieldsSchema } from "./schema";
import { type fieldsSchema, excludeEmailSchema } from "./schema";
import { getFieldIdentifier } from "./utils/getFieldIdentifier";
import { getConfig as getVariantsConfig } from "./utils/variantsConfig";
@@ -459,11 +459,8 @@ function FieldEditDialog({
}) {
const { t } = useLocale();
const fieldForm = useForm<RhfFormField>({
defaultValues: {
type: "text",
...dialog.data,
},
resolver: zodResolver(fieldSchema),
defaultValues: dialog.data || {},
//resolver: zodResolver(fieldSchema),
});
const formFieldType = fieldForm.getValues("type");
@@ -577,10 +574,22 @@ function FieldEditDialog({
<FieldWithLengthCheckSupport containerClassName="mt-6" fieldForm={fieldForm} />
) : null}
{fieldType.value === "email" && fieldForm.getValues("name") === "email" && (
{formFieldType === "email" && (
<InputField
{...fieldForm.register("excludeEmails")}
containerClassName="mt-6"
onChange={(e) => {
try {
excludeEmailSchema.parse(e.target.value);
fieldForm.clearErrors("excludeEmails");
} catch (err) {
if (err instanceof ZodError) {
fieldForm.setError("excludeEmails", {
message: err.errors[0]?.message || "Invalid input",
});
}
}
}}
label={t("exclude_emails_that_contain")}
placeholder="gmail.com, hotmail.com, ..."
/>
+21 -22
View File
@@ -36,6 +36,26 @@ export const EditableSchema = z.enum([
"user-readonly", // All fields are readOnly.
]);
export const excludeEmailSchema = z.string().superRefine((val, ctx) => {
const allDomains = val.split(",").map((dom) => dom.trim());
const regex = /^(?:@?[a-z0-9-]+(?:\.[a-z]{2,})?)?(?:@[a-z0-9-]+\.[a-z]{2,})?$/;
/*
Valid patterns - [ example, example.anything, anyone@example.anything ]
Invalid patterns - Patterns involving capital letter [ Example, Example.anything, Anyone@example.anything ]
*/
const isValid = !allDomains.some((domain) => !regex.test(domain));
if (!isValid) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Enter valid domain or email",
});
}
});
const baseFieldSchema = z.object({
name: z.string().transform(getValidRhfFieldName),
type: fieldTypeEnum,
@@ -101,28 +121,7 @@ const baseFieldSchema = z.object({
maxLength: z.number().optional(),
// Emails that needs to be excluded
excludeEmails: z
.string()
.superRefine((val, ctx) => {
const allDomains = val.split(",").map((dom) => dom.trim());
const regex = /^(?:@?[a-z0-9-]+(?:\.[a-z]{2,})?)?(?:@[a-z0-9-]+\.[a-z]{2,})?$/;
/*
Valid patterns - [ example, example.anything, anyone@example.anything ]
Invalid patterns - Patterns involving capital letter [ Example, Example.anything, Anyone@example.anything ]
*/
const isValid = !allDomains.some((domain) => !regex.test(domain));
if (!isValid) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Enter valid domain or email",
});
}
})
.optional(),
excludeEmails: excludeEmailSchema.optional(),
});
export const variantsConfigSchema = z.object({