import React, { useState } from 'react'; import { FiClock, FiMessageSquare, FiCheckCircle, FiUser, FiBarChart2, FiInfo, FiZap } from 'react-icons/fi'; const RiskCard = ({ student, spaceName, onResolve, onGetContext, formatOfflineTime }) => { const [showBreakdown, setShowBreakdown] = useState(false); const score = student.metadata?.score || 0; const level = student.level || (score >= 6 ? 'critical' : score >= 3 ? 'warning' : 'safe'); const signals = student.metadata?.signal_details || student.metadata?.signals || {}; const absencePoints = signals.absence_points || 0; const stuckPoints = signals.stuck_points || 0; const quizAvg = signals.quiz_avg_score !== undefined ? signals.quiz_avg_score : null; // Score breakdown from 3 sources - use nullish coalescing for missing fields const breakdown = student.score_breakdown || {}; const lastSeenNormalized = breakdown.last_seen_normalized ?? 0; const fastApiNormalized = breakdown.fastapi_normalized ?? 0; const quizNormalized = breakdown.quiz_normalized ?? 0; const riskColor = level === 'critical' ? 'var(--ta-red)' : level === 'warning' ? 'var(--ta-amber)' : 'var(--ta-green)'; const riskLabel = level === 'critical' ? 'Nghiêm trọng' : level === 'warning' ? 'Cần chú ý' : 'An toàn'; const getScoreBarColor = (value, type) => { // Color gradient: green (low risk) → yellow → red (high risk) if (value < 3) return 'var(--ta-green)'; if (value < 6) return 'var(--ta-amber)'; return 'var(--ta-red)'; }; return (
{/* Cột Avatar */}
{/* Cột Học viên */}
{student.profiles?.display_name || 'Học viên'}
{spaceName}
{/* Cột Risk Score & Level */}
{score.toFixed(1)}
{riskLabel}
{/* Cột Chi tiết Tín hiệu */}
{student.reason}
{absencePoints > 0 && ( Vắng {Math.floor(student.hours_since_active || 0)}h ({absencePoints}đ) )} {stuckPoints > 0 && ( Stuck ({stuckPoints}đ) )} {signals.unanswered_q_points > 0 && ( Chưa trả lời ({signals.unanswered_q_points}đ) )} {signals.frustration_points > 0 && ( Frustration ({signals.frustration_points}đ) )} {quizAvg !== null && quizAvg < 70 && ( Quiz: {quizAvg.toFixed(0)} )}
{/* Cột Breakdown với Tooltip */}
{showBreakdown && (
Chi tiết điểm số
{/* Last Seen */}
Vắng mặt {lastSeenNormalized.toFixed(1)} / 10
{/* FastAPI Signals */}
Tín hiệu chat {fastApiNormalized.toFixed(1)} / 10
{/* Quiz Score */}
Điểm Quiz {quizNormalized.toFixed(1)} / 10
Tổng điểm {score.toFixed(1)}
)}
{/* Thời gian Ngoại tuyến */}
{formatOfflineTime(student)}
{/* Cột Thao tác */}
); }; export default RiskCard;