Spaces:
Sleeping
Sleeping
| import { useRef } from "react"; | |
| import { motion, useInView } from "framer-motion"; | |
| import { useForm } from "react-hook-form"; | |
| import { zodResolver } from "@hookform/resolvers/zod"; | |
| import * as z from "zod"; | |
| import { Mail, User, MessageSquare, Leaf } from "lucide-react"; | |
| import { Button } from "./ui/button"; | |
| import { Input } from "./ui/input"; | |
| import { Textarea } from "./ui/textarea"; | |
| import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select"; | |
| import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "./ui/form"; | |
| import { useToast } from "./ui/use-toast"; | |
| const formSchema = z.object({ | |
| name: z.string().min(2, "Name must be at least 2 characters"), | |
| email: z.string().email("Please enter a valid email address"), | |
| produceType: z.string().min(1, "Please select a produce type"), | |
| message: z.string().min(10, "Message must be at least 10 characters"), | |
| }); | |
| type FormValues = z.infer<typeof formSchema>; | |
| const produceTypes = [ | |
| "Leafy Vegetables", | |
| "Root Vegetables", | |
| "Berries", | |
| "Citrus Fruits", | |
| "Tropical Fruits", | |
| "Stone Fruits", | |
| "Other", | |
| ]; | |
| export default function ContactSection() { | |
| const ref = useRef(null); | |
| const isInView = useInView(ref, { once: true, margin: "-100px" }); | |
| const { toast } = useToast(); | |
| const form = useForm<FormValues>({ | |
| resolver: zodResolver(formSchema), | |
| defaultValues: { | |
| name: "", | |
| email: "", | |
| produceType: "", | |
| message: "", | |
| }, | |
| }); | |
| const onSubmit = (data: FormValues) => { | |
| console.log("Form submitted:", data); | |
| toast({ | |
| title: "Message Sent!", | |
| description: "Thank you for contacting us. We'll get back to you soon.", | |
| }); | |
| form.reset(); | |
| }; | |
| return ( | |
| <section id="contact" className="py-20 bg-gradient-to-b from-white to-gray-50"> | |
| <div className="container mx-auto px-4 sm:px-6 lg:px-8"> | |
| <motion.div | |
| ref={ref} | |
| initial={{ opacity: 0, y: 50 }} | |
| animate={isInView ? { opacity: 1, y: 0 } : { opacity: 0, y: 50 }} | |
| transition={{ duration: 0.6 }} | |
| className="text-center mb-12" | |
| > | |
| <h2 className="text-4xl md:text-5xl font-bold text-gray-900 mb-4"> | |
| Get In Touch | |
| </h2> | |
| <p className="text-xl text-gray-600 max-w-3xl mx-auto"> | |
| Have a questions? Let's connect! | |
| </p> | |
| </motion.div> | |
| <div className="grid lg:grid-cols-2 gap-12 items-start"> | |
| {/* Contact Form */} | |
| <motion.div | |
| initial={{ opacity: 0, x: -30 }} | |
| animate={isInView ? { opacity: 1, x: 0 } : { opacity: 0, x: -30 }} | |
| transition={{ duration: 0.6, delay: 0.2 }} | |
| className="bg-white rounded-2xl shadow-xl p-8 border border-gray-100" | |
| > | |
| <Form {...form}> | |
| <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> | |
| <FormField | |
| control={form.control} | |
| name="name" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel className="text-base font-semibold">Full Name</FormLabel> | |
| <FormControl> | |
| <div className="relative"> | |
| <User className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" /> | |
| <Input | |
| placeholder="John Doe" | |
| className="pl-10 h-12" | |
| {...field} | |
| /> | |
| </div> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="email" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel className="text-base font-semibold">Email Address</FormLabel> | |
| <FormControl> | |
| <div className="relative"> | |
| <Mail className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" /> | |
| <Input | |
| type="email" | |
| placeholder="john@example.com" | |
| className="pl-10 h-12" | |
| {...field} | |
| /> | |
| </div> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="produceType" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel className="text-base font-semibold">Produce Type</FormLabel> | |
| <Select onValueChange={field.onChange} value={field.value}> | |
| <FormControl> | |
| <SelectTrigger className="h-12"> | |
| <Leaf className="w-5 h-5 mr-2 text-gray-400" /> | |
| <SelectValue placeholder="Select produce type" /> | |
| </SelectTrigger> | |
| </FormControl> | |
| <SelectContent> | |
| {produceTypes.map((type) => ( | |
| <SelectItem key={type} value={type}> | |
| {type} | |
| </SelectItem> | |
| ))} | |
| </SelectContent> | |
| </Select> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="message" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel className="text-base font-semibold">Message</FormLabel> | |
| <FormControl> | |
| <div className="relative"> | |
| <MessageSquare className="absolute left-3 top-3 w-5 h-5 text-gray-400" /> | |
| <Textarea | |
| placeholder="Tell us about your needs..." | |
| className="pl-10 min-h-[150px] resize-none" | |
| {...field} | |
| /> | |
| </div> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <Button | |
| type="submit" | |
| className="w-full h-12 bg-green-600 hover:bg-green-700 text-lg font-semibold" | |
| > | |
| Send Message | |
| </Button> | |
| </form> | |
| </Form> | |
| </motion.div> | |
| {/* Contact Info */} | |
| <motion.div | |
| initial={{ opacity: 0, x: 30 }} | |
| animate={isInView ? { opacity: 1, x: 0 } : { opacity: 0, x: 30 }} | |
| transition={{ duration: 0.6, delay: 0.4 }} | |
| className="space-y-8" | |
| > | |
| <div className="bg-gradient-to-br from-green-600 to-emerald-600 rounded-2xl p-8 text-white"> | |
| <h3 className="text-2xl font-bold mb-4">Why Contact Us?</h3> | |
| <ul className="space-y-3"> | |
| <li className="flex items-start"> | |
| <span className="text-2xl mr-3">🔬</span> | |
| <span>Expert consultation on produce preservation</span> | |
| </li> | |
| <li className="flex items-start"> | |
| <span className="text-2xl mr-3">📚</span> | |
| <span>Access to exclusive research findings</span> | |
| </li> | |
| <li className="flex items-start"> | |
| <span className="text-2xl mr-3">🤝</span> | |
| <span>Partnership opportunities</span> | |
| </li> | |
| <li className="flex items-start"> | |
| <span className="text-2xl mr-3">💡</span> | |
| <span>Custom solutions for your needs</span> | |
| </li> | |
| </ul> | |
| </div> | |
| <div className="bg-white rounded-2xl shadow-lg p-8 border border-gray-100"> | |
| <h3 className="text-2xl font-bold text-gray-900 mb-6">Contact Information</h3> | |
| <div className="space-y-4"> | |
| <div> | |
| <p className="text-sm text-gray-500 mb-1">Email</p> | |
| <p className="text-lg font-semibold text-gray-900">chopfreshinternational@gmail.com</p> | |
| </div> | |
| <div> | |
| <p className="text-sm text-gray-500 mb-1">Phone</p> | |
| <p className="text-lg font-semibold text-gray-900">+1 (555) 123-4567</p> | |
| </div> | |
| <div> | |
| <p className="text-sm text-gray-500 mb-1">Office Hours</p> | |
| <p className="text-lg font-semibold text-gray-900">Mon-Sat: 9AM - 9PM EST</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div className="bg-gray-100 rounded-2xl p-8"> | |
| <h3 className="text-xl font-bold text-gray-900 mb-3">Response Time</h3> | |
| <p className="text-gray-700"> | |
| We typically respond to all inquiries within 24-48 hours during business days. | |
| For urgent matters, please call our office directly. | |
| </p> | |
| </div> | |
| </motion.div> | |
| </div> | |
| </div> | |
| </section> | |
| ); | |
| } | |