/* UI helpers cho Student Center học viên. */ function scFmtMoney(n) { return Number(n || 0).toLocaleString("vi-VN") + "đ"; } function scFmtDate(ts) { if (!ts) return "Chưa rõ ngày"; const d = new Date(Number(ts) * 1000); return isNaN(d.getTime()) ? "Chưa rõ ngày" : d.toLocaleDateString("vi-VN"); } function scEmpty(text, action) { return
{text}{action || null}
; } function StudentCenterOverview({ center, data, go, onLogout }) { const [confirmLogout, setConfirmLogout] = React.useState(false); const [seenSuggest, setSeenSuggest] = React.useState(() => sessionStorage.getItem("student_center_suggestions_seen") === "1"); const o = (center && center.overall) || {}; const prof = (data && data.profile) || {}; const latest = ((center && center.submissions) || []).slice(0, 3); const suggestions = seenSuggest ? [] : ((center && center.suggestions) || []).slice(0, 2); React.useEffect(() => { if (suggestions.length) sessionStorage.setItem("student_center_suggestions_seen", "1"); }, [suggestions.length]); return
{o.passed || 0}bài đã đạt
{o.artifacts || 0}thành phẩm
{o.owned_courses || 0}khóa đang có

Tài khoản học

Tên học viên: {prof.display_name || (data && data.name) || "Chưa có"}

SĐT: {(data && data.phone) || "Chưa có"}

Email: {prof.contact_email || prof.login_email || (data && data.learn_email) || "Chưa gắn"}

{!confirmLogout ? :
}

Team Sam dùng thông tin này để nhận diện và hỗ trợ đúng học viên.

Việc nên làm tiếp

{latest.length ? latest.map((s) =>

{s.title}
{s.engine.label} · {scFmtDate(s.submitted_at)}

) :

Học và nộp bài đầu tiên, thành quả sẽ tự hiện tại đây.

}

Gợi ý mở rộng nhẹ

{suggestions.length ? suggestions.map((s) =>

{s.name}
{s.reason}

) :

Hoàn thành thêm vài bài, hệ thống sẽ gợi ý khóa liên quan đúng mục tiêu hơn.

}
; } Object.assign(window, { StudentCenterOverview, scFmtMoney, scFmtDate, scEmpty });