Lashtw commited on
Commit
fa931e2
·
verified ·
1 Parent(s): 6401eef

Upload 10 files

Browse files
Files changed (1) hide show
  1. 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');