/** * View Review Page * Display review details in a clean, minimal SaaS-style design */ import React, { useMemo } from "react"; import { useQuery } from "@tanstack/react-query"; import { ArrowLeft, Star, Mail, Calendar, Edit, MapPin } from "lucide-react"; import { __ } from "../lib/i18n"; import { usePermissions } from "../hooks/usePermissions"; import { apiClient } from "../lib/api-client"; import { Button } from "../components/ui/button"; import { PageHeader } from "../components/common/PageHeader"; import { Card, CardContent, CardHeader, CardTitle, } from "../components/ui/card"; import { ConditionalRender } from "../components/ui/conditional-render"; interface ReviewData { id: number; trip_id: number; trip_title: string; trip_slug?: string; customer_name: string; customer_email: string; customer_location?: string; rating: number; title: string; content: string; status: string; verified: boolean; created_at: string; updated_at?: string; } const ViewReview: React.FC = () => { const { can } = usePermissions(); // Get review id from URL const reviewId = useMemo(() => { const params = new URLSearchParams(window.location.search); return params.get("id") ? parseInt(params.get("id") || "0") : null; }, []); // Fetch review data from API const { data: review, isLoading, error, } = useQuery({ queryKey: ["review", reviewId], queryFn: async () => { if (!reviewId) return null; const response = await apiClient.get(`/reviews/${reviewId}`); // Transform API response const data = response?.data || response; return { id: data.id, trip_id: data.trip_id, trip_title: data.trip_title || "Unknown Trip", trip_slug: data.trip_slug || "", customer_name: data.customer_name || data.author_name || "Anonymous", customer_email: data.customer_email || data.author_email || "", customer_location: data.customer_location || data.author_location || "", rating: data.rating, title: data.title || "", content: data.content || "", status: data.status || "pending", verified: data.verified || false, created_at: data.created_at || "", updated_at: data.updated_at || "", }; }, enabled: !!reviewId && can("yatra_view_reviews"), }); const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString("en-US", { weekday: "long", year: "numeric", month: "long", day: "numeric", }); }; const renderStars = (rating: number) => { return (
{[1, 2, 3, 4, 5].map((star) => ( ))} {rating} {__("out of 5", "yatra")}
); }; const getStatusBadge = (status: string) => { const statusMap: Record = { approved: { className: "bg-green-100 text-green-700 dark:bg-green-900/20 dark:text-green-400", label: __("Approved", "yatra"), }, pending: { className: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/20 dark:text-yellow-400", label: __("Pending", "yatra"), }, spam: { className: "bg-red-100 text-red-700 dark:bg-red-900/20 dark:text-red-400", label: __("Spam", "yatra"), }, trash: { className: "bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-400", label: __("Trash", "yatra"), }, }; const statusInfo = statusMap[status] || { className: "bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-400", label: status, }; return ( {statusInfo.label} ); }; const handleBack = () => { window.location.href = `${window.yatraAdmin?.siteUrl || ""}/wp-admin/admin.php?page=yatra&subpage=reviews`; }; const handleEdit = () => { window.location.href = `${window.yatraAdmin?.siteUrl || ""}/wp-admin/admin.php?page=yatra&subpage=reviews&action=edit&id=${reviewId}`; }; if (isLoading) { return (
{__("Back", "yatra")} } />
{/* Main Content Skeleton */}
{[...Array(5)].map((_, i) => (
))}
{/* Sidebar Skeleton */}
); } if (error || !review) { return (
{__("Back to Reviews", "yatra")} } /> {__("Error loading review or review not found", "yatra")}
); } return (
} />
{/* Main Content */}
{/* Review Overview */}
{__("Review Overview", "yatra")} {getStatusBadge(review.status)}
{/* Trip */}
{__("Trip", "yatra")}
{review.trip_id ? ( {review.trip_title} ) : (
{review.trip_title}
)}
{/* Rating */}
{__("Rating", "yatra")}
{renderStars(review.rating)}
{/* Title */}
{__("Review Title", "yatra")}
{review.title}
{/* Comment */}
{__("Review Comment", "yatra")}
{review.content}
{/* Sidebar */}
{/* Customer Information */} {__("Customer Information", "yatra")}
{__("Customer Name", "yatra")}
{review.customer_name}
{__("Email Address", "yatra")}
{review.customer_email || ( {__("Not provided", "yatra")} )}
{review.customer_location && (
{__("Location", "yatra")}
{review.customer_location}
)} {review.verified && (
{__("Verified Purchase", "yatra")}
)}
{/* Timeline */} {__("Timeline", "yatra")}
{__("Created", "yatra")}
{formatDate(review.created_at)}
{review.updated_at && review.updated_at !== review.created_at && (
{__("Last Updated", "yatra")}
{formatDate(review.updated_at)}
)}
); }; export default ViewReview;