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'; import { FeedbackIdentityModal } from './FeedbackIdentityModal'; interface PhotoLikesProps { photoId: string; gallerySlug: string; isLiked: boolean; likeCount: number; isEnabled: boolean; requireNameEmail?: boolean; onLikeChange?: (liked: boolean) => void; } export const PhotoLikes: React.FC = ({ photoId, gallerySlug, isLiked, likeCount, isEnabled, requireNameEmail = false, onLikeChange }) => { const { t } = useTranslation(); const queryClient = useQueryClient(); const [isSubmitting, setIsSubmitting] = useState(false); const [animating, setAnimating] = useState(false); const [showIdentityModal, setShowIdentityModal] = useState(false); const [savedIdentity, setSavedIdentity] = useState<{ name: string; email: string } | null>(null); const submitLikeMutation = useMutation({ mutationFn: (data: { guest_name?: string; guest_email?: string } = {}) => feedbackService.submitFeedback(gallerySlug, photoId, { feedback_type: 'like', guest_name: data.guest_name || undefined, guest_email: data.guest_email || undefined }), 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; if (requireNameEmail && !savedIdentity) { setShowIdentityModal(true); } else { submitLikeMutation.mutate(savedIdentity || {}); } }; const handleIdentitySubmit = (name: string, email: string) => { setSavedIdentity({ name, email }); setShowIdentityModal(false); submitLikeMutation.mutate({ guest_name: name, guest_email: email }); }; if (!isEnabled) return null; return ( <> setShowIdentityModal(false)} onSubmit={handleIdentitySubmit} feedbackType={t('feedback.like', 'like')} /> ); };