Taste_Rider_Web / src /components /TestimonialsSection.jsx
Harry9233's picture
Upload 20790 files
5c05829 verified
import React, { useState, useEffect } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { Card, CardContent } from '@/components/ui/card';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { ChevronLeft, ChevronRight, Star, Award, ShoppingBag, Users, ThumbsUp, Check, Calendar } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Link } from 'react-router-dom';
const testimonials = [
{
name: "Deepa Patel",
title: "Professional Chef, Mumbai",
image: "https://images.pexels.com/photos/3764014/pexels-photo-3764014.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "After switching to Taste Rider's Premium Garam Masala, customer satisfaction at my restaurant increased by 27%. The depth of flavor is unmatched in the market - I've tried 8 different brands and nothing compares.",
rating: 5,
product: "Premium Garam Masala",
verified: true,
purchaseCount: 12,
date: "2 months ago"
},
{
name: "Vikram Singh",
title: "Culinary Instructor, Delhi",
image: "https://images.pexels.com/photos/775032/pexels-photo-775032.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "I recommend Taste Rider's Organic Kashmiri Saffron to all 200+ students in my cooking classes. The vibrant color and authentic aroma elevate every dish. My students report 90% better results compared to supermarket alternatives.",
rating: 5,
product: "Organic Kashmiri Saffron",
verified: true,
purchaseCount: 24,
date: "1 month ago"
},
{
name: "Sunita Rao",
title: "Award-Winning Home Chef, Bangalore",
image: "https://images.pexels.com/photos/5947033/pexels-photo-5947033.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "I've been cooking for 35+ years, and Taste Rider's Sambar Masala is the closest I've found to my mother's recipe. The freshness is evident - my family can taste the difference immediately. I'm now a loyal monthly subscriber.",
rating: 5,
product: "Authentic Sambar Masala",
verified: true,
purchaseCount: 18,
date: "2 weeks ago"
},
{
name: "Rajiv Mehta",
title: "Food Blogger & Influencer, Chennai",
image: "https://images.pexels.com/photos/2379005/pexels-photo-2379005.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "My followers constantly ask about the secret to my vibrant curries. The answer is simple: Taste Rider's spices. The freshness and purity make an incredible difference that even my viewers can see through their screens!",
rating: 5,
product: "Signature Curry Blend",
verified: true,
purchaseCount: 30,
date: "3 days ago"
},
];
// Testimonial stats for social proof
const testimonialStats = {
totalReviews: 10842,
averageRating: 4.8,
fiveStarPercentage: 92,
repeatCustomers: 78
};
const TestimonialsSection = () => {
const [currentIndex, setCurrentIndex] = useState(0);
const [autoplay, setAutoplay] = useState(true);
const handlePrev = () => {
setCurrentIndex((prevIndex) => (prevIndex - 1 + testimonials.length) % testimonials.length);
setAutoplay(false); // Pause autoplay when user interacts
};
const handleNext = () => {
setCurrentIndex((prevIndex) => (prevIndex + 1) % testimonials.length);
setAutoplay(false); // Pause autoplay when user interacts
};
useEffect(() => {
let timer;
if (autoplay) {
timer = setTimeout(handleNext, 7000);
}
return () => clearTimeout(timer);
}, [currentIndex, autoplay]);
return (
<section className="py-12 md:py-20 bg-gradient-to-b from-amber-50 to-amber-100/70">
<div className="container mx-auto px-4">
<motion.div
initial={{ opacity: 0, y: -20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className="text-center mb-12 md:mb-16"
>
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold text-amber-800 mb-3 text-shadow-md">
Trusted by 2000 Culinary Enthusiasts
</h2>
<p className="text-lg text-stone-700 max-w-2xl mx-auto">
See why professional chefs and home cooks alike choose our premium spices for their most important dishes
</p>
{/* Review Stats Bar */}
<div className="mt-8 bg-white/80 backdrop-blur-sm rounded-xl shadow-md p-4 max-w-4xl mx-auto">
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700">{testimonialStats.totalReviews.toLocaleString()}+</div>
<div className="text-sm text-stone-600">Verified Reviews</div>
</div>
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700 flex items-center justify-center">
{testimonialStats.averageRating}
<Star className="h-5 w-5 ml-1 text-yellow-500 fill-yellow-500" />
</div>
<div className="text-sm text-stone-600">Average Rating</div>
</div>
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700">{testimonialStats.fiveStarPercentage}%</div>
<div className="text-sm text-stone-600">5-Star Reviews</div>
</div>
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700">{testimonialStats.repeatCustomers}%</div>
<div className="text-sm text-stone-600">Repeat Customers</div>
</div>
</div>
</div>
</motion.div>
<div className="relative max-w-2xl lg:max-w-3xl mx-auto">
<AnimatePresence mode="wait">
<motion.div
key={currentIndex}
initial={{ opacity: 0, x: 50 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -50 }}
transition={{ duration: 0.5, ease: "easeInOut" }}
className="w-full"
>
<Card className="bg-white/90 backdrop-blur-md shadow-xl border-amber-300/50 p-6 md:p-8 lg:p-10 rounded-xl">
<CardContent className="text-center">
<div className="flex justify-center items-center gap-2 mb-2">
<span className="bg-green-100 text-green-800 text-xs font-medium px-2.5 py-0.5 rounded-full flex items-center">
<Award className="h-3 w-3 mr-1" /> Verified Purchase
</span>
<span className="bg-blue-100 text-blue-800 text-xs font-medium px-2.5 py-0.5 rounded-full flex items-center">
<Calendar className="h-3 w-3 mr-1" /> {testimonials[currentIndex].date}
</span>
</div>
<Avatar className="h-20 w-20 md:h-24 md:w-24 mx-auto mb-4 md:mb-6 border-4 border-amber-400 shadow-md">
<AvatarImage src={testimonials[currentIndex].image} alt={testimonials[currentIndex].name} />
<AvatarFallback className="text-amber-700 bg-amber-200 text-2xl md:text-3xl">
{testimonials[currentIndex].name.split(" ").map(n => n[0]).join("")}
</AvatarFallback>
</Avatar>
<p className="text-lg md:text-xl lg:text-2xl text-stone-700 italic mb-4 md:mb-6 leading-relaxed" style={{ fontFamily: "'Lato', sans-serif"}}>
"{testimonials[currentIndex].quote}"
</p>
<div className="flex justify-center mb-3 md:mb-4">
{[...Array(testimonials[currentIndex].rating)].map((_, i) => (
<Star key={i} className="h-5 w-5 md:h-6 md:w-6 text-yellow-500 fill-yellow-500" />
))}
{[...Array(5 - testimonials[currentIndex].rating)].map((_, i) => (
<Star key={i} className="h-5 w-5 md:h-6 md:w-6 text-yellow-300" />
))}
</div>
<h4 className="text-xl md:text-2xl font-semibold text-amber-700">{testimonials[currentIndex].name}</h4>
<p className="text-sm md:text-base text-stone-500 mb-3">{testimonials[currentIndex].title}</p>
<div className="flex items-center justify-center text-sm text-amber-600 mb-4">
<ShoppingBag className="h-4 w-4 mr-1" />
<span>Purchased {testimonials[currentIndex].product} {testimonials[currentIndex].purchaseCount}+ times</span>
</div>
{/* Product Link */}
<Link
to="/product-categories"
className="inline-block bg-amber-600 hover:bg-amber-700 text-white text-sm font-medium px-4 py-2 rounded-full transition-colors duration-300"
>
Shop {testimonials[currentIndex].product} Now
</Link>
</CardContent>
</Card>
</motion.div>
</AnimatePresence>
<Button
variant="ghost"
size="icon"
onClick={handlePrev}
className="absolute left-0 sm:-left-10 top-1/2 -translate-y-1/2 z-10 text-amber-600 hover:bg-amber-200/70 p-2 md:p-3"
>
<ChevronLeft className="h-6 w-6 md:h-8 md:w-8" />
</Button>
<Button
variant="ghost"
size="icon"
onClick={handleNext}
className="absolute right-0 sm:-right-10 top-1/2 -translate-y-1/2 z-10 text-amber-600 hover:bg-amber-200/70 p-2 md:p-3"
>
<ChevronRight className="h-6 w-6 md:h-8 md:w-8" />
</Button>
</div>
<div className="flex justify-center mt-8 space-x-2">
{testimonials.map((_, index) => (
<button
key={index}
onClick={() => {
setCurrentIndex(index);
setAutoplay(false);
}}
className={`h-2.5 w-2.5 md:h-3 md:w-3 rounded-full transition-all duration-300 ${
currentIndex === index ? 'bg-amber-500 scale-125' : 'bg-amber-300 hover:bg-amber-400'
}`}
aria-label={`Go to testimonial ${index + 1}`}
/>
))}
</div>
{/* Social Proof and CTA */}
<div className="mt-16 text-center">
<div className="flex items-center justify-center mb-6">
<Users className="h-5 w-5 text-amber-600 mr-2" />
<p className="text-amber-700 font-medium">Join thousands of satisfied customers who've transformed their cooking</p>
</div>
<Link to="/product-categories">
<Button className="bg-amber-600 hover:bg-amber-700 text-white px-8 py-3 rounded-full text-lg font-semibold shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
<ThumbsUp className="mr-2 h-5 w-5" />
Discover Our Top-Rated Products
</Button>
</Link>
<div className="mt-6 flex flex-wrap justify-center gap-3">
<span className="bg-amber-100 text-amber-800 text-xs font-medium px-3 py-1 rounded-full flex items-center">
<Check className="h-3 w-3 mr-1" /> Premium Quality
</span>
<span className="bg-amber-100 text-amber-800 text-xs font-medium px-3 py-1 rounded-full flex items-center">
<Check className="h-3 w-3 mr-1" /> Authentic Flavors
</span>
<span className="bg-amber-100 text-amber-800 text-xs font-medium px-3 py-1 rounded-full flex items-center">
<Check className="h-3 w-3 mr-1" /> 30-Day Guarantee
</span>
{/* Removed free shipping badge */}
</div>
</div>
</div>
</section>
);
};
export default TestimonialsSection;