feat: enhance contact form with team size and server count fields

- Added optional fields for team size and server count in the contact form for sales inquiries.
- Updated the API to format email content with the new fields when applicable.
- Implemented validation to ensure team size is selected for sales inquiries, improving user experience and data collection.
This commit is contained in:
Mauricio Siu
2026-05-04 14:50:47 -06:00
parent 455f877643
commit 194bd37cd5
2 changed files with 77 additions and 1 deletions

View File

@@ -8,6 +8,8 @@ const FREE_EMAIL_DOMAINS: Set<string> = new Set(require("free-email-domains"));
interface ContactFormData {
inquiryType: "support" | "sales";
teamSize?: string;
serverCount?: string;
firstName: string;
lastName: string;
email: string;
@@ -103,6 +105,10 @@ export async function POST(request: NextRequest) {
// Format email content
const emailSubject = `[${body.inquiryType.toUpperCase()}] New contact form submission from ${body.firstName} ${body.lastName}`;
const salesFields =
body.inquiryType === "sales"
? `Employees: ${body.teamSize || "N/A"}\nServers: ${body.serverCount || "N/A"}\n`
: "";
const emailBody = `
New contact form submission:
@@ -111,7 +117,7 @@ First Name: ${body.firstName}
Last Name: ${body.lastName}
Email: ${body.email}
Company: ${body.company}
${salesFields}
Message:
${body.message}

View File

@@ -17,6 +17,8 @@ const FREE_EMAIL_DOMAINS: Set<string> = new Set(require("free-email-domains"));
interface ContactFormData {
inquiryType: "" | "support" | "sales";
deploymentType: "" | "cloud" | "self-hosted";
teamSize: string;
serverCount: string;
firstName: string;
lastName: string;
email: string;
@@ -44,6 +46,8 @@ export function ContactForm({
const [formData, setFormData] = useState<ContactFormData>({
inquiryType: defaultInquiryType || "",
deploymentType: "",
teamSize: "",
serverCount: "",
firstName: "",
lastName: "",
email: "",
@@ -78,6 +82,9 @@ export function ContactForm({
newErrors.email =
"Please use your work email address to contact sales";
}
if (formData.inquiryType === "sales" && !formData.teamSize) {
newErrors.teamSize = "Please select your team size";
}
if (!formData.company.trim()) {
newErrors.company = "Company name is required";
}
@@ -125,6 +132,8 @@ export function ContactForm({
setFormData({
inquiryType: defaultInquiryType || "",
deploymentType: "",
teamSize: "",
serverCount: "",
firstName: "",
lastName: "",
email: "",
@@ -297,6 +306,67 @@ export function ContactForm({
</div>
)}
{formData.inquiryType === "sales" && (
<div className="grid grid-cols-1 gap-6 sm:grid-cols-2">
<div className="space-y-2">
<label
htmlFor="teamSize"
className="block text-sm font-medium text-foreground"
>
Number of Employees <span className="text-red-500">*</span>
</label>
<Select
value={formData.teamSize}
onValueChange={(value) => handleInputChange("teamSize", value)}
>
<SelectTrigger className="bg-input">
<SelectValue placeholder="Select range" />
</SelectTrigger>
<SelectContent>
<SelectItem value="1-10">110</SelectItem>
<SelectItem value="11-50">1150</SelectItem>
<SelectItem value="51-200">51200</SelectItem>
<SelectItem value="201-500">201500</SelectItem>
<SelectItem value="501-1000">5011,000</SelectItem>
<SelectItem value="1000+">1,000+</SelectItem>
</SelectContent>
</Select>
{errors.teamSize && (
<p className="text-sm text-red-600">{errors.teamSize}</p>
)}
</div>
<div className="space-y-2">
<label
htmlFor="serverCount"
className="block text-sm font-medium text-foreground"
>
Number of Servers
</label>
<Select
value={formData.serverCount}
onValueChange={(value) =>
handleInputChange("serverCount", value)
}
>
<SelectTrigger className="bg-input">
<SelectValue placeholder="Select range" />
</SelectTrigger>
<SelectContent>
<SelectItem value="1-5">15</SelectItem>
<SelectItem value="6-20">620</SelectItem>
<SelectItem value="21-50">2150</SelectItem>
<SelectItem value="51-100">51100</SelectItem>
<SelectItem value="100+">100+</SelectItem>
</SelectContent>
</Select>
{errors.serverCount && (
<p className="text-sm text-red-600">{errors.serverCount}</p>
)}
</div>
</div>
)}
<div className="grid grid-cols-1 gap-6 sm:grid-cols-2">
<div className="space-y-2">
<label