import React, { useState } from 'react'; import { Star } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { feedbackService } from '../../services/feedback.service'; import { toast } from 'react-toastify'; interface PhotoRatingProps { photoId: string; gallerySlug: string; currentRating?: number; averageRating?: number; totalRatings?: number; isEnabled: boolean; onRatingChange?: (rating: number) => void; } export const PhotoRating: React.FC = ({ photoId, gallerySlug, currentRating = 0, averageRating = 0, totalRatings = 0, isEnabled, onRatingChange }) => { const { t } = useTranslation(); const queryClient = useQueryClient(); const [hoveredRating, setHoveredRating] = useState(0); const [isSubmitting, setIsSubmitting] = useState(false); const submitRatingMutation = useMutation({ mutationFn: (rating: number) => feedbackService.submitFeedback(gallerySlug, photoId, { feedback_type: 'rating', rating }), onMutate: async (rating) => { setIsSubmitting(true); // Optimistic update if (onRatingChange) { onRatingChange(rating); } }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['photo-feedback', gallerySlug, photoId] }); toast.success(t('feedback.ratingSubmitted', 'Rating submitted')); }, onError: (error: any) => { // Revert optimistic update if (onRatingChange && currentRating) { onRatingChange(currentRating); } if (error.response?.status === 429) { toast.error(t('feedback.rateLimited', 'Please wait before rating again')); } else { toast.error(t('feedback.ratingError', 'Failed to submit rating')); } }, onSettled: () => { setIsSubmitting(false); } }); const handleRatingClick = (rating: number) => { if (!isEnabled || isSubmitting) return; // If clicking the same rating, remove it const newRating = rating === currentRating ? 0 : rating; submitRatingMutation.mutate(newRating); }; if (!isEnabled) return null; return (
{/* Star Rating Input */}
{[1, 2, 3, 4, 5].map((star) => ( ))}
{/* Average Rating Display */} {totalRatings > 0 && (
{averageRating.toFixed(1)} ({t('feedback.ratingsCount', '{{count}} ratings', { count: totalRatings })})
)}
); };