import { useState, useEffect } from 'react'; import { Heart } from 'lucide-react'; import { likeTrack, unlikeTrack, getTrackLikes, TrackUploadError } from '../services/trackService'; import { Button } from '@/components/ui/button'; import { useToast } from '@/hooks/useToast'; import { cn } from '@/lib/utils'; interface LikeButtonProps { trackId: number; className?: string; } /** * LikeButton Component * T0285: Composant pour liker/unliker un track avec animation */ export function LikeButton({ trackId, className }: LikeButtonProps) { const [isLiked, setIsLiked] = useState(false); const [count, setCount] = useState(0); const [loading, setLoading] = useState(false); const [animating, setAnimating] = useState(false); const { toast } = useToast(); useEffect(() => { loadLikes(); }, [trackId]); const loadLikes = async () => { try { const data = await getTrackLikes(trackId); setIsLiked(data.isLiked); setCount(data.count); } catch (error) { console.error('Failed to load likes:', error); // Ne pas afficher d'erreur toast pour le chargement initial } }; const handleToggle = async () => { if (loading) return; setLoading(true); setAnimating(true); // Animation duration setTimeout(() => setAnimating(false), 300); try { if (isLiked) { await unlikeTrack(trackId); setIsLiked(false); setCount((c) => Math.max(0, c - 1)); } else { await likeTrack(trackId); setIsLiked(true); setCount((c) => c + 1); } } catch (error) { console.error('Failed to toggle like:', error); // Revert state on error setIsLiked((prev) => !prev); setCount((c) => (isLiked ? c + 1 : Math.max(0, c - 1))); // Show error toast if (error instanceof TrackUploadError) { toast.error(error.message); } else { toast.error('Impossible de modifier le like. Veuillez réessayer.'); } } finally { setLoading(false); } }; return ( ); }