App.VotePoll = function VotePoll({ code }) { const [poll, setPoll] = React.useState(null); const [combos, setCombos] = React.useState([]); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(''); const [voting, setVoting] = React.useState({}); const [removing, setRemoving] = React.useState(null); const [showAddCombo, setShowAddCombo] = React.useState(false); const loadPoll = () => { App.API.get('polls/' + code + '?fingerprint=' + App.fingerprint) .then(data => { setPoll(data.poll); setCombos(data.combos); setLoading(false); }) .catch(err => { setError(err.message); setLoading(false); }); }; React.useEffect(() => { loadPoll(); }, [code]); const handleRate = (pollComboId, rating) => { setVoting(prev => ({ ...prev, [pollComboId]: true })); App.API.post('votes', { pollComboId: pollComboId, rating: rating, fingerprint: App.fingerprint, }).then(() => { setCombos(prev => prev.map(c => c.poll_combo_id === pollComboId ? { ...c, userRating: rating } : c )); setVoting(prev => ({ ...prev, [pollComboId]: false })); }).catch(err => { alert(err.message); setVoting(prev => ({ ...prev, [pollComboId]: false })); }); }; const handleRemoveCombo = (pollComboId, comboName) => { if (!confirm('Remove "' + comboName + '" from this poll? All votes for it will be deleted.')) return; setRemoving(pollComboId); App.API.post('polls/' + code, { _action: 'remove-combo', pollComboId: pollComboId, fingerprint: App.fingerprint, }).then(() => { setRemoving(null); loadPoll(); }).catch(err => { alert(err.message); setRemoving(null); }); }; if (loading) return ; if (error) return
{error}
; if (showAddCombo) { return ( { setShowAddCombo(false); loadPoll(); }} onClose={() => setShowAddCombo(false)} /> ); } const renderCarList = (combo) => { const cars = combo.cars || []; const catBadges = (combo.categories || []).map((cat, i) => ( All {cat.category_name} )); return (
{cars.map((car, i) => (
{car.name} {car.name}
))} {catBadges}
); }; return (

{poll.title}

View Results

Rate each combo from 1 to 5 stars

{combos.map(combo => (
{combo.track_name}

{combo.combo_name}

{(poll.isPollOwner || combo.is_mine) && ( )}
Track: {combo.track_name}
{renderCarList(combo)}
handleRate(combo.poll_combo_id, r)} /> {combo.userRating && ( Your vote: {combo.userRating}/5 )}
))}
); };