Spaces:
Running
Running
Upload 10 files
Browse files- src/views/InstructorView.js +64 -0
src/views/InstructorView.js
CHANGED
|
@@ -452,6 +452,13 @@ export function setupInstructorEvents() {
|
|
| 452 |
const snapshotBtn = document.getElementById('snapshot-btn');
|
| 453 |
let isSnapshotting = false;
|
| 454 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 455 |
// Permission Check Helper
|
| 456 |
const checkPermissions = (instructor) => {
|
| 457 |
if (!instructor) return;
|
|
@@ -662,7 +669,64 @@ export function setupInstructorEvents() {
|
|
| 662 |
});
|
| 663 |
}
|
| 664 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 665 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 666 |
|
| 667 |
// Rejoin Room
|
| 668 |
const rejoinBtn = document.getElementById('rejoin-room-btn');
|
|
|
|
| 452 |
const snapshotBtn = document.getElementById('snapshot-btn');
|
| 453 |
let isSnapshotting = false;
|
| 454 |
|
| 455 |
+
// AI Settings UI
|
| 456 |
+
const setupAiBtn = document.getElementById('setup-ai-btn');
|
| 457 |
+
const aiSettingsModal = document.getElementById('ai-settings-modal');
|
| 458 |
+
const geminiKeyInput = document.getElementById('gemini-api-key');
|
| 459 |
+
const toggleStudentAi = document.getElementById('toggle-student-ai');
|
| 460 |
+
const saveAiSettingsBtn = document.getElementById('save-ai-settings');
|
| 461 |
+
|
| 462 |
// Permission Check Helper
|
| 463 |
const checkPermissions = (instructor) => {
|
| 464 |
if (!instructor) return;
|
|
|
|
| 669 |
});
|
| 670 |
}
|
| 671 |
|
| 672 |
+
// AI Settings Logic
|
| 673 |
+
if (setupAiBtn) {
|
| 674 |
+
setupAiBtn.addEventListener('click', () => {
|
| 675 |
+
const key = localStorage.getItem('vibecoding_gemini_key') || '';
|
| 676 |
+
const studentEnabled = localStorage.getItem('vibecoding_student_ai_enabled') === 'true';
|
| 677 |
+
|
| 678 |
+
if (geminiKeyInput) geminiKeyInput.value = key;
|
| 679 |
+
if (toggleStudentAi) toggleStudentAi.checked = studentEnabled;
|
| 680 |
+
|
| 681 |
+
if (aiSettingsModal) aiSettingsModal.classList.remove('hidden');
|
| 682 |
+
});
|
| 683 |
+
}
|
| 684 |
+
|
| 685 |
+
if (saveAiSettingsBtn) {
|
| 686 |
+
saveAiSettingsBtn.addEventListener('click', async () => {
|
| 687 |
+
const key = geminiKeyInput ? geminiKeyInput.value.trim() : '';
|
| 688 |
+
const studentEnabled = toggleStudentAi ? toggleStudentAi.checked : false;
|
| 689 |
+
|
| 690 |
+
if (key) {
|
| 691 |
+
localStorage.setItem('vibecoding_gemini_key', key);
|
| 692 |
+
} else {
|
| 693 |
+
localStorage.removeItem('vibecoding_gemini_key');
|
| 694 |
+
}
|
| 695 |
+
|
| 696 |
+
localStorage.setItem('vibecoding_student_ai_enabled', studentEnabled);
|
| 697 |
+
|
| 698 |
+
// Update Firestore if in a room
|
| 699 |
+
const roomCode = localStorage.getItem('vibecoding_instructor_room');
|
| 700 |
|
| 701 |
+
if (roomCode) {
|
| 702 |
+
try {
|
| 703 |
+
const { getFirestore, doc, updateDoc } = await import("https://www.gstatic.com/firebasejs/10.7.1/firebase-firestore.js");
|
| 704 |
+
const db = getFirestore();
|
| 705 |
+
await updateDoc(doc(db, "classrooms", roomCode), { ai_active: studentEnabled });
|
| 706 |
+
} catch (e) {
|
| 707 |
+
console.error("Failed to sync AI setting to room:", e);
|
| 708 |
+
}
|
| 709 |
+
}
|
| 710 |
+
|
| 711 |
+
// Initialize Gemini (if key exists)
|
| 712 |
+
if (key) {
|
| 713 |
+
try {
|
| 714 |
+
const { initGemini } = await import("../services/gemini.js");
|
| 715 |
+
await initGemini(key);
|
| 716 |
+
geminiEnabled = true; // Update module-level var
|
| 717 |
+
alert("AI 設定已儲存並啟動!");
|
| 718 |
+
} catch (e) {
|
| 719 |
+
console.error(e);
|
| 720 |
+
alert("AI 啟動失敗: " + e.message);
|
| 721 |
+
}
|
| 722 |
+
} else {
|
| 723 |
+
geminiEnabled = false;
|
| 724 |
+
alert("AI 設定已儲存 (停用)");
|
| 725 |
+
}
|
| 726 |
+
|
| 727 |
+
if (aiSettingsModal) aiSettingsModal.classList.add('hidden');
|
| 728 |
+
});
|
| 729 |
+
}
|
| 730 |
|
| 731 |
// Rejoin Room
|
| 732 |
const rejoinBtn = document.getElementById('rejoin-room-btn');
|