ChopFresh / src /components /ContactSection.tsx
pranav8tripathi@gmail.com
init
56ea4c7
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>
);
}