'use client' import { useState } from 'react' import { Card, CardContent, CardHeader } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { Star, ThumbsUp, Flag, MoreHorizontal, Edit, Trash2, Verified } from 'lucide-react' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { formatDistanceToNow } from 'date-fns' import Image from 'next/image' import { toast } from 'sonner' import { useSession } from 'next-auth/react' interface Review { id: string rating: number title?: string comment?: string images: string[] isVerified: boolean helpfulVotes: number createdAt: string user: { id: string name: string image?: string } _count?: { helpfulVotedBy: number } } interface ReviewCardProps { review: Review onEdit?: (review: Review) => void onDelete?: (reviewId: string) => void onHelpfulVote?: (reviewId: string) => void onReport?: (reviewId: string) => void userHasVoted?: boolean } export default function ReviewCard({ review, onEdit, onDelete, onHelpfulVote, onReport, userHasVoted = false }: ReviewCardProps) { const { data: session } = useSession() const [isVoting, setIsVoting] = useState(false) const [hasVoted, setHasVoted] = useState(userHasVoted) const [voteCount, setVoteCount] = useState(review.helpfulVotes) const isOwner = session?.user?.id === review.user.id const handleHelpfulVote = async () => { if (!session) { toast.error('Please sign in to vote on reviews') return } setIsVoting(true) try { const response = await fetch(`/api/reviews/${review.id}/helpful`, { method: 'POST' }) const data = await response.json() if (response.ok) { setHasVoted(data.voted) setVoteCount(prev => data.voted ? prev + 1 : prev - 1) toast.success(data.message) onHelpfulVote?.(review.id) } else { toast.error(data.error || 'Failed to vote') } } catch (error) { toast.error('Failed to vote on review') } finally { setIsVoting(false) } } const handleReport = () => { if (!session) { toast.error('Please sign in to report reviews') return } onReport?.(review.id) } const renderStars = (rating: number) => { return Array.from({ length: 5 }, (_, index) => ( )) } return ( {review.user.name?.split(' ').map(n => n[0]).join('') || 'U'} {review.user.name} {review.isVerified && ( Verified Purchase )} {renderStars(review.rating)} • {formatDistanceToNow(new Date(review.createdAt), { addSuffix: true })} {isOwner && ( onEdit?.(review)}> Edit Review onDelete?.(review.id)} className="text-red-600" > Delete Review )} {review.title && ( {review.title} )} {review.comment && ( {review.comment} )} {review.images.length > 0 && ( {review.images.map((image, index) => ( ))} )} Helpful ({voteCount}) {!isOwner && ( Report )} ) }
{review.comment}