import SEO from '@/components/SEO' import { useState, useRef, useEffect } from 'react' import { toast } from 'sonner' import { Button } from '@/components/ui/Button' import { Input } from '@/components/ui/Input' import { Textarea } from '@/components/ui/Textarea' import RecaptchaPlaceholder from '@/components/RecaptchaPlaceholder' import { ArrowRight } from 'lucide-react' const Contact = () => { const formRef = useRef(null) const [formState, setFormState] = useState({ 'Last Name': '', Company: '', Email: '', Phone: '', 'Zip Code': '', Description: '', }) const [errors, setErrors] = useState({ 'Last Name': '', Company: '', Email: '', 'Zip Code': '', Description: '', recaptcha_token: '', }) const [debouncedErrors, setDebouncedErrors] = useState(errors) const [isSubmitting, setIsSubmitting] = useState(false) useEffect(() => { const t = setTimeout(() => setDebouncedErrors(errors), 300) return () => clearTimeout(t) }, [errors]) useEffect(() => { const iframe = document.getElementById('zoho_webform_iframe') if (!iframe) return const handleLoad = () => { if (!isSubmitting) return setIsSubmitting(false) toast.success("Thanks! We'll be in touch shortly.") setFormState({ 'Last Name': '', Company: '', Email: '', Phone: '', 'Zip Code': '', Description: '' }) setErrors({ 'Last Name': '', Company: '', Email: '', 'Zip Code': '', Description: '', recaptcha_token: '' }) } iframe.addEventListener('load', handleLoad) return () => iframe.removeEventListener('load', handleLoad) }, [isSubmitting]) useEffect(() => { const script = document.createElement('script') script.id = 'wf_anal' script.src = 'https://crm.zohopublic.com/crm/WebFormAnalyticsServeServlet?rid=e44e9662530fc5bd9cdd3c43501fc243f89ba03759e7946c4b5e5016795b606b59b54d0e73c68671b2140fac5c8e788agid3b907524e85f9cba94899d77d7200771ee5d0ea567c43ec341d7b2ce40324d40gid26922a9cd1e8191a5f58ecb2524e0d22b8dd027eb943658ee681ab6890436af2gidefa1b1002d15951a0a2ac36cb33cdb4b5c6aeb110e6f4ac68b764345b9429653&tw=e048253ca680b107993ed5922e00cc1ebab3de97e797fce56fc6ad6af0dfc0bc' document.body.appendChild(script) return () => { document.getElementById('wf_anal')?.remove() } }, []) const validateForm = () => { const newErrors = { 'Last Name': '', Company: '', Email: '', 'Zip Code': '', Description: '', recaptcha_token: '' } if (!formState.Company.trim()) newErrors.Company = 'Company name is required' if (!formState['Last Name'].trim()) newErrors['Last Name'] = 'Name is required' if (!formState['Zip Code'].trim()) newErrors['Zip Code'] = 'ZIP code is required' if (!formState.Description.trim()) newErrors.Description = 'Message is required' const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ if (!formState.Email.trim()) { newErrors.Email = 'Email is required' } else if (!emailRegex.test(formState.Email)) { newErrors.Email = 'Please enter a valid email address' } const hasErrors = Object.values(newErrors).some(error => error !== '') setErrors(newErrors) if (hasErrors) { toast.error('Please fix the errors in the form') return false } return true } const handleSubmit = (e) => { e.preventDefault() if (!validateForm()) return setIsSubmitting(true) formRef.current.submit() } const handleChange = (e) => { const { name, value } = e.target setFormState(prev => ({ ...prev, [name]: value })) if (errors[name]) setErrors(prev => ({ ...prev, [name]: '' })) } const contactDetails = [ { label: 'Phone', icon: ( ), content: (
(321) 730-8020 (888) 656-2850 Toll-Free
), }, { label: 'Office', icon: ( ), content: ( 7901 4th St N St. Petersburg, FL 33702 ), }, { label: 'Hours', icon: ( ), content:

Mon – Fri: 8:00 AM – 6:00 PM CT

, }, ] const trustPoints = [
8x8 Certified Partner with proven expertise
, 'Cisco Certified Partner',
25+ years of experience
, 'SMB to Enterprise solutions', 'No vendor bias — we recommend what fits', ] return ( <> {/* Hero */}
Queue North communications infrastructure consultation
Contact

Let's Talk

Tell us about your business and we'll cut through the noise to find what actually works for you.

Send a Message
{/* Contact Body */}
{/* Left: Info panel — order 2 on mobile so form appears first */}
{contactDetails.map((item) => (
{item.icon}

{item.label}

{item.content}
))}

Why Queue North Technologies

    {trustPoints.map((point, i) => (
  • {point}
  • ))}
{/* Right: Form panel — order 1 on mobile so it appears first */}

Send Us a Message

We typically respond within one business day.

{/* Zoho required hidden fields */} {/* Honeypot */} {/* Company */}
{debouncedErrors.Company &&

{debouncedErrors.Company}

}
{/* Name + Email */}
{debouncedErrors['Last Name'] &&

{debouncedErrors['Last Name']}

}
{debouncedErrors.Email &&

{debouncedErrors.Email}

}
{/* Phone + ZIP */}
{debouncedErrors['Zip Code'] &&

{debouncedErrors['Zip Code']}

}
{/* Message */}