import React, { useState, useEffect } from 'react'; import { useParams, Link } from 'react-router-dom'; import { useAuth } from '../AuthContext'; import api from '../api'; export default function ChallengeDetail() { const { id } = useParams(); const { user } = useAuth(); const [challenge, setChallenge] = useState(null); const [predictions, setPredictions] = useState([]); const [leaderboard, setLeaderboard] = useState([]); const [newPrediction, setNewPrediction] = useState(''); const [inviteQuery, setInviteQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [showInvite, setShowInvite] = useState(false); const [loading, setLoading] = useState(true); useEffect(() => { loadChallenge(); loadPredictions(); loadLeaderboard(); }, [id]); const loadChallenge = async () => { try { const data = await api.getChallenge(id); setChallenge(data); } catch (err) { console.error('Failed to load challenge:', err); } finally { setLoading(false); } }; const loadPredictions = async () => { try { const data = await api.getPredictions(id); setPredictions(data.predictions); } catch (err) { console.error('Failed to load predictions:', err); } }; const loadLeaderboard = async () => { try { const data = await api.getChallengeLeaderboard(id); setLeaderboard(data.leaderboard); } catch (err) { console.error('Failed to load leaderboard:', err); } }; const handleCreatePrediction = async (e) => { e.preventDefault(); if (!newPrediction.trim()) return; try { await api.createPrediction({ challenge_id: id, content: newPrediction }); setNewPrediction(''); await loadPredictions(); } catch (err) { alert('Failed to create prediction: ' + err.message); } }; const handleValidate = async (predictionId, status) => { try { await api.validatePrediction(predictionId, status); await loadPredictions(); await loadLeaderboard(); } catch (err) { alert('Failed to validate: ' + err.message); } }; const handleSearchUsers = async (query) => { setInviteQuery(query); if (query.trim().length < 2) { setSearchResults([]); return; } try { const data = await api.searchUsers(query); setSearchResults(data.users); } catch (err) { console.error('Search failed:', err); } }; const handleInvite = async (userId) => { try { await api.inviteToChallenge(id, { user_ids: [userId] }); setInviteQuery(''); setSearchResults([]); alert('Invitation sent!'); } catch (err) { alert('Failed to send invite: ' + err.message); } }; if (loading) { return
Loading challenge...
; } if (!challenge) { return
Challenge not found
; } return (
{/* Header */}
← Back to Challenges
{challenge.challenge.cover_image_url && ( {challenge.challenge.title} )}

{challenge.challenge.title}

Created by {challenge.challenge.creator_username}

{/* Invite Section */} {showInvite && (

Invite Someone

handleSearchUsers(e.target.value)} /> {searchResults.length > 0 && (
{searchResults.map(user => (
handleInvite(user.id)} style={{ padding: '1rem', borderBottom: '1px solid var(--border)', cursor: 'pointer' }} >
{user.username}
{user.email}
))}
)}
)}
{/* Main Content */}
{/* New Prediction */}

Make a Prediction