import { renderLandingView, setupLandingEvents } from './views/LandingView.js'; import { renderInstructorView, setupInstructorEvents } from './views/InstructorView.js'; import { renderStudentView, setupStudentEvents } from './views/StudentView.js'; import { renderAdminView, setupAdminEvents } from './views/AdminView.js'; const app = document.querySelector('#app'); function navigateTo(view) { // Update hash maybe? For now simple switch switch (view) { case 'landing': app.innerHTML = renderLandingView(); setupLandingEvents(navigateTo); break; case 'instructor': app.innerHTML = '載入中...'; // Async render because Instructor view fetches challenges for column headers renderInstructorView().then(html => { app.innerHTML = html; setupInstructorEvents(); }); break; case 'student': app.innerHTML = '載入中...'; // Async render because Student view fetches challenges renderStudentView().then(html => { app.innerHTML = html; setupStudentEvents(); }).catch(err => { console.error("Student View Load Error:", err); app.innerHTML = `

載入失敗

${err.message}

`; }); break; case 'admin': app.innerHTML = renderAdminView(); setupAdminEvents(); break; default: app.innerHTML = renderLandingView(); setupLandingEvents(navigateTo); } } // Route Handler function handleRoute() { const hash = window.location.hash.slice(1); if (hash === 'admin') { navigateTo('admin'); return; } if (hash === 'instructor') { navigateTo('instructor'); return; } const roomCode = localStorage.getItem('vibecoding_room_code'); const userId = localStorage.getItem('vibecoding_user_id'); // Changed key to match new logic if (roomCode && userId && !hash) { navigateTo('student'); } else { navigateTo('landing'); } } // Listen to hash changes window.addEventListener('hashchange', handleRoute); // Initial Load handleRoute();