import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import Layout from '../components/layout/Layout'; import { matchesAPI } from '../services/api'; import { Star, Loader2 } from 'lucide-react'; const RatePartnerPage = () => { const { slug } = useParams(); const navigate = useNavigate(); const [match, setMatch] = useState(null); const [loading, setLoading] = useState(true); const [rating, setRating] = useState(0); const [hoveredRating, setHoveredRating] = useState(0); const [comment, setComment] = useState(''); const [wouldCollaborateAgain, setWouldCollaborateAgain] = useState(true); const [submitting, setSubmitting] = useState(false); // Load match data and check if already rated useEffect(() => { const loadMatch = async () => { try { setLoading(true); const result = await matchesAPI.getMatch(slug); setMatch(result.data); // Check if this match can be rated if (result.data.status !== 'accepted' && result.data.status !== 'completed') { alert('This match must be accepted before rating.'); navigate('/matches'); return; } // Check if user has already rated this match if (result.data.hasRated) { alert('You have already rated this match.'); navigate('/matches'); return; } } catch (error) { console.error('Failed to load match:', error); alert('Failed to load match. Redirecting to matches page.'); navigate('/matches'); } finally { setLoading(false); } }; loadMatch(); }, [slug, navigate]); const partner = match?.partner; const handleSubmit = async (e) => { e.preventDefault(); if (rating === 0) { alert('Please select a rating (1-5 stars)'); return; } setSubmitting(true); try { await matchesAPI.createRating(slug, { score: rating, comment: comment.trim() || null, wouldCollaborateAgain, }); alert('Rating submitted successfully!'); navigate('/matches'); } catch (error) { console.error('Failed to submit rating:', error); if (error.message?.includes('already rated')) { alert('You have already rated this match.'); } else { alert('Failed to submit rating. Please try again.'); } } finally { setSubmitting(false); } }; if (loading || !match || !partner) { return ( ); } return ( Rate the collaboration {/* Partner Info */} {partner.firstName && partner.lastName ? `${partner.firstName} ${partner.lastName}` : partner.username} @{partner.username} {/* Rating Stars */} How would you rate the collaboration? {[1, 2, 3, 4, 5].map((star) => ( setRating(star)} onMouseEnter={() => setHoveredRating(star)} onMouseLeave={() => setHoveredRating(0)} className="focus:outline-none transition-transform hover:scale-110" > ))} {rating === 0 && 'Click to rate'} {rating === 1 && 'Poor'} {rating === 2 && 'Fair'} {rating === 3 && 'Good'} {rating === 4 && 'Very good'} {rating === 5 && 'Excellent!'} {/* Comment */} Comment (optional) setComment(e.target.value)} rows={4} className="w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-primary-500 focus:border-primary-500" placeholder="Share your thoughts about the collaboration..." /> {/* Would Collaborate Again */} setWouldCollaborateAgain(e.target.checked)} className="w-5 h-5 text-primary-600 border-gray-300 rounded focus:ring-primary-500" /> I would like to collaborate again {/* Submit Button */} {submitting ? 'Saving...' : 'Save rating'} ); }; export default RatePartnerPage;
@{partner.username}
{rating === 0 && 'Click to rate'} {rating === 1 && 'Poor'} {rating === 2 && 'Fair'} {rating === 3 && 'Good'} {rating === 4 && 'Very good'} {rating === 5 && 'Excellent!'}