diff --git a/apps/remix/app/components/embed/embed-direct-template-client-page.tsx b/apps/remix/app/components/embed/embed-direct-template-client-page.tsx index 62b53d308..ce190b50e 100644 --- a/apps/remix/app/components/embed/embed-direct-template-client-page.tsx +++ b/apps/remix/app/components/embed/embed-direct-template-client-page.tsx @@ -14,6 +14,7 @@ import { import { LucideChevronDown, LucideChevronUp } from 'lucide-react'; import { DateTime } from 'luxon'; import { useSearchParams } from 'react-router'; +import { z } from 'zod'; import { useThrottleFn } from '@documenso/lib/client-only/hooks/use-throttle-fn'; import { DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; @@ -35,6 +36,7 @@ import type { TSignFieldWithTokenMutationSchema, } from '@documenso/trpc/server/field-router/schema'; import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip'; +import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { ElementVisible } from '@documenso/ui/primitives/element-visible'; import { Input } from '@documenso/ui/primitives/input'; @@ -94,6 +96,7 @@ export const EmbedDirectTemplateClientPage = ({ const [isNameLocked, setIsNameLocked] = useState(false); const [showPendingFieldTooltip, setShowPendingFieldTooltip] = useState(false); + const [emailError, setEmailError] = useState(null); const [throttledOnCompleteClick, isThrottled] = useThrottleFn(() => void onCompleteClick(), 500); @@ -207,6 +210,14 @@ export const EmbedDirectTemplateClientPage = ({ return; } + const { success: isEmailValid } = z.string().email().safeParse(email); + + if (!isEmailValid) { + setEmailError(_(msg`A valid email is required`)); + setIsExpanded(true); + return; + } + let directTemplateExternalId = searchParams?.get('externalId') || undefined; if (directTemplateExternalId) { @@ -442,11 +453,23 @@ export const EmbedDirectTemplateClientPage = ({ !isEmailLocked && setEmail(e.target.value.trim())} + onChange={(e) => { + if (!isEmailLocked) { + setEmail(e.target.value.trim()); + setEmailError(null); + } + }} /> + + {emailError && ( +

{emailError}

+ )} {hasSignatureField && (