import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import ScoreSlider from '../components/ScoreSlider.jsx' import MismatchAlert from '../components/MismatchAlert.jsx' export default function CandidateScoring() { const navigate = useNavigate() const [clients, setClients] = useState([]) const [barsData, setBarsData] = useState(null) const [loading, setLoading] = useState(true) // Form states const [selectedClientId, setSelectedClientId] = useState('') const [name, setName] = useState('') const [email, setEmail] = useState('') const [recruiterNotes, setRecruiterNotes] = useState('') // Competency scores (default to 3) const [scores, setScores] = useState({ communication: 3, adaptability: 3, collaboration: 3, problem_solving: 3, leadership: 3, }) // Results after submission const [submittedCandidate, setSubmittedCandidate] = useState(null) const [mismatches, setMismatches] = useState([]) const [overallMatch, setOverallMatch] = useState(null) const [submitting, setSubmitting] = useState(false) const [error, setError] = useState('') useEffect(() => { async function loadData() { try { const [clientsRes, barsRes] = await Promise.all([ fetch('/api/clients'), fetch('/api/bars'), ]) const clientsJson = await clientsRes.json() const barsJson = await barsRes.json() setClients(clientsJson) setBarsData(barsJson) if (clientsJson.length > 0) { setSelectedClientId(clientsJson[0].id) } } catch (err) { console.error(err) setError('Failed to load initial data. Make sure the backend is running.') } finally { setLoading(false) } } loadData() }, []) const handleScoreChange = (competency, val) => { setScores(prev => ({ ...prev, [competency]: val, })) } const handleSubmit = async (e) => { e.preventDefault() if (!selectedClientId) { setError('Please select a client first.') return } setSubmitting(true) setError('') setSubmittedCandidate(null) setMismatches([]) setOverallMatch(null) try { // 1. Create candidate const candidateRes = await fetch('/api/candidates', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, email, recruiter_notes: recruiterNotes, client_id: parseInt(selectedClientId), }), }) if (!candidateRes.ok) { const errJson = await candidateRes.json() throw new Error(errJson.detail || 'Failed to create candidate.') } const candidate = await candidateRes.json() // 2. Submit scores for the candidate const scoreRes = await fetch(`/api/candidates/${candidate.id}/scores`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(scores), }) if (!scoreRes.ok) { const errJson = await scoreRes.json() throw new Error(errJson.detail || 'Failed to submit scores.') } const scoreData = await scoreRes.json() setSubmittedCandidate(candidate) setMismatches(scoreData.mismatches || []) setOverallMatch(scoreData.overall_match) } catch (err) { console.error(err) setError(err.message || 'An error occurred during submission.') } finally { setSubmitting(false) } } if (loading) { return
Loading candidates and BARS setup...
} if (clients.length === 0) { return (

No Clients Found

You must set up at least one client before scoring candidates.

) } return ( <>

Candidate Scoring

{error &&
{error}
}

Candidate & Scoring Form

setName(e.target.value)} placeholder="e.g. John Doe" />
setEmail(e.target.value)} placeholder="e.g. john.doe@example.com" />