import React, { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "../ui/card"; import { Button } from "../ui/button"; import { Badge } from "../ui/badge"; import { Star, User, MapPin, Calendar, Loader2 } from "lucide-react"; import { apiService } from "../../lib/api-client"; const __ = (text: string) => { return (window as any)?.yatraAdmin?.translations?.[text] || text; }; interface Review { id: number; trip_id: number; rating: number; title: string; content: string; author_name: string; author_location: string | null; created_at: string; status: "pending" | "approved" | "rejected"; } interface TestimonialsSelectorProps { tripId: number | null; selectedReviewIds: number[]; onChange: (reviewIds: number[]) => void; } export const TestimonialsSelector: React.FC = ({ tripId, selectedReviewIds, onChange, }) => { const [reviews, setReviews] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (tripId) { fetchReviews(); } else { setReviews([]); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [tripId]); const fetchReviews = async () => { if (!tripId) return; setLoading(true); setError(null); try { const data = await apiService.getReviews({ trip_id: tripId, status: "approved", per_page: 100, }); setReviews(data.data || []); } catch (err) { console.error("Error fetching reviews:", err); setError(__("Failed to load reviews. Please try again.")); } finally { setLoading(false); } }; const toggleReview = (reviewId: number) => { const newSelection = selectedReviewIds.includes(reviewId) ? selectedReviewIds.filter((id) => id !== reviewId) : [...selectedReviewIds, reviewId]; onChange(newSelection); }; const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric", }); }; const renderStars = (rating: number) => { return (
{[1, 2, 3, 4, 5].map((star) => ( ))}
); }; if (!tripId) { return ( {__("Testimonials")} {__("Select reviews to display as testimonials")}

{__("Save the trip first to select testimonials from reviews")}

); } return ( {__("Testimonials")} {__( "Select approved reviews to display as testimonials on the trip page", )} {loading ? (
{__("Loading reviews...")}
) : error ? (

{error}

) : reviews.length === 0 ? (

{__("No approved reviews yet")}

{__( "Reviews will appear here once customers submit and they are approved", )}

) : (

{selectedReviewIds.length > 0 ? __(`${selectedReviewIds.length} review(s) selected`) : __("Select reviews to feature as testimonials")}

{selectedReviewIds.length > 0 && ( )}
{reviews.map((review) => (
toggleReview(review.id)} >
toggleReview(review.id)} className="mt-1 w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" />
{review.author_name} {review.author_location && ( {review.author_location} )}
{renderStars(review.rating)}
{formatDate(review.created_at)}
{review.title && (

{review.title}

)}

{review.content}

{selectedReviewIds.includes(review.id) && ( {__("Selected as testimonial")} )}
))}
)}
); };