${studentInfo.fullName}
${studentInfo.email}
import './style.css'; import './app.css'; // Trạng thái cục bộ let loggedIn = false; let studentInfo = null; let stats = { wifiSSID: '', onlineSecs: 0, offlineSecs: 0, wsConnected: false, serverReachable: false, allowedApps: '', monitorMode: '', monitorLabel: '', className: '', classCode: '', currentPeriod: 0, currentCourseName: '', shifts: [] }; // Quản lý webcam let webcamStream = null; let webcamInterval = null; const webcamVideo = document.createElement('video'); webcamVideo.autoplay = true; webcamVideo.playsInline = true; webcamVideo.style.display = 'none'; document.body.appendChild(webcamVideo); const webcamCanvas = document.createElement('canvas'); webcamCanvas.width = 320; webcamCanvas.height = 240; webcamCanvas.style.display = 'none'; document.body.appendChild(webcamCanvas); function init() { if (typeof window.go === 'undefined' || typeof window.go.main === 'undefined') { setTimeout(init, 200); return; } window.runtime.EventsOn('start_webcam_stream', startWebcam); window.runtime.EventsOn('stop_webcam_stream', stopWebcam); checkLogin(); } async function checkLogin() { try { const isLogged = await window.go.main.App.CheckLoginStatus(); if (isLogged) { loggedIn = true; studentInfo = await window.go.main.App.GetStudentInfo(); renderDashboard(); startStatsTicker(); } else { loggedIn = false; renderLoginPrompt(); } } catch (err) { console.error('Error checking login status:', err); } } function renderLoginPrompt() { document.querySelector('#app').innerHTML = `
Ứng dụng sẽ chuyển hướng bạn đến trang Rikkei Portal. Sau khi đăng nhập thành công, hệ thống sẽ tự động đồng bộ tài khoản học tập của bạn.
| Ca | Môn học | Giờ | Trực tuyến | Ngoại tuyến | Điểm danh |
|---|---|---|---|---|---|
| Ca ${s.period}${s.isActiveNow ? ' đang học' : ''} | ${s.courseName || '—'} | ${s.startTime}–${s.endTime} | ${formatDuration(s.onlineSeconds || 0)} | ${formatDuration(s.offlineSeconds || 0)} | ${s.attendanceLabel || 'Chưa tính'} |
${studentInfo.email}