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.username}

{partner.firstName && partner.lastName ? `${partner.firstName} ${partner.lastName}` : partner.username}

@{partner.username}

{/* Rating Stars */}
{[1, 2, 3, 4, 5].map((star) => ( ))}

{rating === 0 && 'Click to rate'} {rating === 1 && 'Poor'} {rating === 2 && 'Fair'} {rating === 3 && 'Good'} {rating === 4 && 'Very good'} {rating === 5 && 'Excellent!'}

{/* Comment */}