import { createSignal, Show } from 'solid-js'; import { z } from 'zod'; import { FormEvent, LeadsConfig, MessageType } from '@/components/Bot'; import { addLeadQuery, LeadCaptureInput } from '@/queries/sendMessageQuery'; import { SaveLeadButton } from '@/components/buttons/LeadCaptureButtons'; import { Avatar } from '@/components/avatars/Avatar'; import { getLocalStorageChatflow, setLocalStorageChatflow } from '@/utils'; type Props = { message: MessageType; chatflowid: string; chatId: string; leadsConfig?: LeadsConfig; apiHost?: string; showAvatar?: boolean; avatarSrc?: string; backgroundColor?: string; textColor?: string; sendButtonColor?: string; fontSize?: number; isLeadSaved: boolean; setIsLeadSaved: (value: boolean) => void; setLeadEmail: (value: string) => void; }; const defaultBackgroundColor = '#f7f8ff'; const defaultTextColor = '#303235'; const defaultFontSize = 16; const phoneRegex = new RegExp(/^([+]?[\s0-9]+)?(\d{3}|[(]?[0-9]+[)])?([-]?[\s]?[0-9])+$/); const LeadCaptureSchema = z.object({ name: z.string().min(2, 'Name is too short').optional(), email: z.string().email('Please provide a valid email').optional(), phone: z.string().min(5, 'Phone number is too short').regex(phoneRegex, 'Invalid Number!').optional(), }); export const LeadCaptureBubble = (props: Props) => { const [leadName, setLeadName] = createSignal(''); const [leadEmail, setLeadEmail] = createSignal(''); const [leadPhone, setLeadPhone] = createSignal(''); const [isLeadSaving, setIsLeadSaving] = createSignal(false); const [leadFormError, setLeadFormError] = createSignal>(); const handleLeadCaptureSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLeadSaving(true); const data = Object.fromEntries(new FormData(e.currentTarget)); const res = LeadCaptureSchema.safeParse(data); if (res.success) { const body: LeadCaptureInput = { chatflowid: props.chatflowid, chatId: props.chatId, name: leadName(), email: leadEmail(), phone: leadPhone(), }; const result = await addLeadQuery({ apiHost: props.apiHost, body, }); if (result.data) { setLocalStorageChatflow(props.chatflowid, props.chatId, { lead: { name: leadName(), email: leadEmail(), phone: leadPhone(), }, }); props.setIsLeadSaved(true); props.setLeadEmail(leadEmail()); } } else { const error = res.error.flatten(); setLeadFormError(error.fieldErrors); } setIsLeadSaving(false); }; return (
{props.isLeadSaved || getLocalStorageChatflow(props.chatflowid)?.lead ? (
{props.leadsConfig?.successMessage || 'Thank you for submitting your contact information.'}
) : (
{props.leadsConfig?.title || 'Let us know where we can reach you:'}
{props.leadsConfig?.name && (
setLeadName(e.currentTarget.value)} />
{leadFormError() && leadFormError()?.name && {leadFormError()?.name[0]}}
)} {props.leadsConfig?.email && (
setLeadEmail(e.currentTarget.value)} />
{leadFormError() && leadFormError()?.email && {leadFormError()?.email[0]}}
)} {props.leadsConfig?.phone && (
setLeadPhone(e.target.value)} />
{leadFormError() && leadFormError()?.phone && {leadFormError()?.phone[0]}}
)}
)}
); };