Spaces:
Sleeping
Sleeping
lakshmisravya123
Upgrade: STAR method coaching, ideal answers, follow-up questions, detailed scoring
f88c6fa | import React, { useState } from 'react'; | |
| function scoreClass(score) { | |
| if (score >= 70) return 'good'; | |
| if (score >= 40) return 'ok'; | |
| return 'bad'; | |
| } | |
| function ScoreBar({ label, value, max = 10 }) { | |
| const pct = (value / max) * 100; | |
| const cls = value >= 7 ? 'good' : value >= 4 ? 'ok' : 'bad'; | |
| return ( | |
| <div className="score-bar-row"> | |
| <span className="score-bar-label">{label}</span> | |
| <div className="score-bar-track"> | |
| <div className={`score-bar-fill ${cls}`} style={{ width: `${pct}%` }} /> | |
| </div> | |
| <span className={`score-bar-value ${cls}`}>{value}/{max}</span> | |
| </div> | |
| ); | |
| } | |
| function PriorityBadge({ priority }) { | |
| return <span className={`priority-badge priority-${priority}`}>{priority.toUpperCase()}</span>; | |
| } | |
| export default function Report({ data, onReset }) { | |
| const { report, details, meta } = data; | |
| const [activeSection, setActiveSection] = useState('overview'); | |
| const sections = [ | |
| { id: 'overview', label: 'Overview' }, | |
| { id: 'communication', label: 'Communication Profile' }, | |
| { id: 'patterns', label: 'Interview Patterns' }, | |
| { id: 'actionplan', label: 'Action Plan' }, | |
| { id: 'breakdown', label: 'Q&A Breakdown' }, | |
| { id: 'tips', label: 'Next Steps' }, | |
| ]; | |
| return ( | |
| <div className="report"> | |
| <div className="report-header"> | |
| <div className={`report-score ${scoreClass(report.overallScore)}`}> | |
| {report.overallScore} | |
| </div> | |
| <div className="score-label" style={{ color: 'var(--text-dim)' }}>Overall Score</div> | |
| <div className={`verdict ${report.verdict}`}>{report.verdict.replace(/_/g, ' ')}</div> | |
| <div className="readiness">{report.readinessLevel}</div> | |
| </div> | |
| <div className="report-tabs"> | |
| {sections.map(sec => ( | |
| <button | |
| key={sec.id} | |
| className={`report-tab ${activeSection === sec.id ? 'active' : ''}`} | |
| onClick={() => setActiveSection(sec.id)} | |
| > | |
| {sec.label} | |
| </button> | |
| ))} | |
| </div> | |
| <div className="report-tab-content"> | |
| {activeSection === 'overview' && ( | |
| <> | |
| <div className="report-card"> | |
| <h3>Summary</h3> | |
| <p className="report-summary">{report.summary}</p> | |
| </div> | |
| <div className="report-card strengths"> | |
| <h3>Top Strengths</h3> | |
| <ul>{report.topStrengths?.map((s, i) => <li key={i}>{s}</li>)}</ul> | |
| </div> | |
| <div className="report-card improve"> | |
| <h3>Areas to Improve</h3> | |
| <ul>{report.areasToImprove?.map((a, i) => <li key={i}>{a}</li>)}</ul> | |
| </div> | |
| <div className="report-card"> | |
| <h3>Recommendation</h3> | |
| <p className="report-summary">{report.recommendation}</p> | |
| </div> | |
| </> | |
| )} | |
| {activeSection === 'communication' && report.communicationProfile && ( | |
| <div className="report-card"> | |
| <h3>Communication Profile</h3> | |
| <p className="section-desc">How you come across in an interview setting, scored across five key dimensions.</p> | |
| <div className="comm-scores"> | |
| <ScoreBar label="Clarity" value={report.communicationProfile.clarity} /> | |
| <ScoreBar label="Conciseness" value={report.communicationProfile.conciseness} /> | |
| <ScoreBar label="Confidence" value={report.communicationProfile.confidence} /> | |
| <ScoreBar label="Storytelling" value={report.communicationProfile.storytelling} /> | |
| <ScoreBar label="Technical Articulation" value={report.communicationProfile.technicalArticulation} /> | |
| </div> | |
| </div> | |
| )} | |
| {activeSection === 'patterns' && report.interviewPatterns && ( | |
| <div className="report-card"> | |
| <h3>Interview Patterns</h3> | |
| <p className="section-desc">Patterns observed across all your answers.</p> | |
| <div className="pattern-trajectory"> | |
| <span className="trajectory-label">Performance Trajectory:</span> | |
| <span className={`trajectory-value trajectory-${report.interviewPatterns.trajectory}`}> | |
| {report.interviewPatterns.trajectory === 'improving' ? 'Improving' : | |
| report.interviewPatterns.trajectory === 'declining' ? 'Declining' : 'Stable'} | |
| </span> | |
| </div> | |
| {report.interviewPatterns.consistentStrengths?.length > 0 && ( | |
| <div className="pattern-section"> | |
| <h4>Consistent Strengths</h4> | |
| <ul className="pattern-list pattern-strengths"> | |
| {report.interviewPatterns.consistentStrengths.map((p, i) => <li key={i}>{p}</li>)} | |
| </ul> | |
| </div> | |
| )} | |
| {report.interviewPatterns.consistentWeaknesses?.length > 0 && ( | |
| <div className="pattern-section"> | |
| <h4>Consistent Weaknesses</h4> | |
| <ul className="pattern-list pattern-weaknesses"> | |
| {report.interviewPatterns.consistentWeaknesses.map((p, i) => <li key={i}>{p}</li>)} | |
| </ul> | |
| </div> | |
| )} | |
| </div> | |
| )} | |
| {activeSection === 'actionplan' && report.actionPlan?.length > 0 && ( | |
| <div className="report-card"> | |
| <h3>Personalized Action Plan</h3> | |
| <p className="section-desc">Your prioritized roadmap to interview readiness.</p> | |
| <div className="action-plan"> | |
| {report.actionPlan.map((item, i) => ( | |
| <div key={i} className="action-item"> | |
| <div className="action-header"> | |
| <PriorityBadge priority={item.priority} /> | |
| <span className="action-timeframe">{item.timeframe}</span> | |
| </div> | |
| <p className="action-text">{item.action}</p> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| )} | |
| {activeSection === 'breakdown' && ( | |
| <div className="report-card"> | |
| <h3>Question-by-Question Breakdown</h3> | |
| {details.map((d, i) => ( | |
| <div key={i} className="qa-breakdown-item"> | |
| <p className="qa-question">Q{i + 1}: {d.question}</p> | |
| <p className="qa-answer"> | |
| Your answer: {d.answer.substring(0, 200)}{d.answer.length > 200 ? '...' : ''} | |
| </p> | |
| <p className="qa-score-line"> | |
| Score: <span className={`qa-score ${d.score >= 7 ? 'good' : d.score >= 4 ? 'ok' : 'bad'}`}> | |
| {d.score}/10 | |
| </span> | |
| {' '}{d.feedback} | |
| </p> | |
| </div> | |
| ))} | |
| </div> | |
| )} | |
| {activeSection === 'tips' && ( | |
| <div className="report-card"> | |
| <h3>Tips for Your Next Practice Session</h3> | |
| {report.mockInterviewTips?.length > 0 && ( | |
| <ul className="tips-list"> | |
| {report.mockInterviewTips.map((tip, i) => <li key={i}>{tip}</li>)} | |
| </ul> | |
| )} | |
| </div> | |
| )} | |
| </div> | |
| <button className="btn-secondary" onClick={onReset}> | |
| Start New Interview | |
| </button> | |
| </div> | |
| ); | |
| } | |