import React, { useState } from 'react'; import { Heart } 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 PhotoLikesProps { photoId: string; gallerySlug: string; isLiked: boolean; likeCount: number; isEnabled: boolean; onLikeChange?: (liked: boolean) => void; } export const PhotoLikes: React.FC = ({ photoId, gallerySlug, isLiked, likeCount, isEnabled, onLikeChange }) => { const { t } = useTranslation(); const queryClient = useQueryClient(); const [isSubmitting, setIsSubmitting] = useState(false); const [animating, setAnimating] = useState(false); const submitLikeMutation = useMutation({ mutationFn: () => feedbackService.submitFeedback(gallerySlug, photoId, { feedback_type: 'like' }), onMutate: async () => { setIsSubmitting(true); setAnimating(true); // Optimistic update if (onLikeChange) { onLikeChange(!isLiked); } }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['photo-feedback', gallerySlug, photoId] }); }, onError: (error: any) => { // Revert optimistic update if (onLikeChange) { onLikeChange(isLiked); } if (error.response?.status === 429) { toast.error(t('feedback.rateLimited', 'Please wait before liking again')); } else { toast.error(t('feedback.likeError', 'Failed to update like')); } }, onSettled: () => { setIsSubmitting(false); setTimeout(() => setAnimating(false), 300); } }); const handleLikeClick = () => { if (!isEnabled || isSubmitting) return; submitLikeMutation.mutate(); }; if (!isEnabled) return null; return ( ); };