From 713195495b4e8b19103ecf3e301b0747ecc4dc7c Mon Sep 17 00:00:00 2001 From: 092vk Date: Thu, 6 Nov 2025 23:25:35 +0530 Subject: [PATCH 1/3] added architect form --- src/components/HeroArchitectForm.tsx | 171 +++++++++++++++++++++++++++ src/pages/categories/Architects.tsx | 9 +- 2 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 src/components/HeroArchitectForm.tsx diff --git a/src/components/HeroArchitectForm.tsx b/src/components/HeroArchitectForm.tsx new file mode 100644 index 00000000..9f00e1a8 --- /dev/null +++ b/src/components/HeroArchitectForm.tsx @@ -0,0 +1,171 @@ +import React, { useState } from 'react'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { Calendar } from '@/components/ui/calendar'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Textarea } from '@/components/ui/textarea'; +import { Calendar as CalendarIcon, Phone, MapPin } from 'lucide-react'; +import { format } from 'date-fns'; +import { useToast } from '@/hooks/use-toast'; +import { supabase } from '@/integrations/supabase/client'; + +export function HeroArchitectForm() { + const [preferredDate, setPreferredDate] = useState(); + const [dateOpen, setDateOpen] = useState(false); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [phone, setPhone] = useState(''); + const [projectType, setProjectType] = useState(''); + const [location, setLocation] = useState(''); + const [budget, setBudget] = useState(''); + const [message, setMessage] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + const { toast } = useToast(); + + const validate = () => { + if (!name.trim()) return 'Please enter your name'; + if (!phone.trim() || phone.replace(/\D/g, '').length < 10) return 'Please enter a valid 10-digit phone number'; + if (!projectType) return 'Please select a project type'; + return null; + }; + + const handleSubmit = async () => { + const errorMsg = validate(); + if (errorMsg) { + toast({ title: 'Error', description: errorMsg, variant: 'destructive' }); + return; + } + + if (isSubmitting) return; + setIsSubmitting(true); + + try { + const payload: any = { + client_name: name.trim(), + phone: phone.trim(), + project_type: projectType, + preferred_date: preferredDate ? format(preferredDate, 'yyyy-MM-dd') : null, + location: location.trim() || null, + budget: budget ? Number(budget) : null, + message: message.trim() || null, + status: 'pending', + created_at: new Date().toISOString(), + }; + + const { error } = await supabase.from('ArchitectRequest').insert([payload]); + + if (error) throw error; + + toast({ title: 'Request sent', description: 'We will contact you soon.', }); + + // reset + setPreferredDate(undefined); + setName(''); + setPhone(''); + setProjectType(''); + setLocation(''); + setBudget(''); + setMessage(''); + } catch (err: any) { + console.error('Architect request error', err); + toast({ title: 'Error', description: err?.message || 'Failed to submit request', variant: 'destructive' }); + } finally { + setIsSubmitting(false); + } + }; + + return ( +
+
+

Book Architect/Designer Services

+ +
+
+
+
+ + setName(e.target.value)} placeholder="Your full name" /> +
+ +
+ +
+ + setPhone(e.target.value.replace(/\D/g, '').slice(0, 10))} placeholder="Phone number" /> +
+ {phone && phone.length < 10 &&

Enter 10 digits

} +
+ +
+ + +
+ +
+ + + + + + + { setPreferredDate(d); setDateOpen(false); }} + initialFocus + className="p-3" + disabled={(d) => d <= new Date(new Date().setHours(0, 0, 0, 0))} + /> + + +
+
+ +
+
+ +
+ + setLocation(e.target.value)} placeholder="Enter your address" /> +
+
+ +
+ + setBudget(e.target.value.replace(/[^0-9]/g, ''))} placeholder="Budget" /> +
+ +
+ +