Skip to content

Commit 980c931

Browse files
Archithclaude
andcommitted
Add comprehensive debugging for activity tracking Firebase integration
- Added detailed logging for Firebase save/retrieve operations - Created testActivitySave() debug function to verify Firebase connectivity - Enhanced error handling with success/failure indicators - Added logging for activity logs to help diagnose empty Activity tab issue - Improved visibility into Firebase database operations This will help diagnose why session 466325 shows empty activity data. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 1fdd1b7 commit 980c931

3 files changed

Lines changed: 181 additions & 10 deletions

File tree

api/activity/save.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// API endpoint to save activity data
2+
// Since Firebase is disabled, we'll store in memory (temporary)
3+
// In production, you'd want to use a database like Supabase
4+
5+
// In-memory storage (resets when server restarts)
6+
const activityStorage = {};
7+
8+
export default async function handler(req, res) {
9+
// Enable CORS
10+
res.setHeader('Access-Control-Allow-Credentials', true);
11+
res.setHeader('Access-Control-Allow-Origin', '*');
12+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
13+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
14+
15+
if (req.method === 'OPTIONS') {
16+
res.status(200).end();
17+
return;
18+
}
19+
20+
const { sessionCode } = req.query;
21+
22+
if (!sessionCode) {
23+
return res.status(400).json({ error: 'Session code required' });
24+
}
25+
26+
if (req.method === 'POST') {
27+
// Save activity data
28+
const activityData = req.body;
29+
30+
if (!activityStorage[sessionCode]) {
31+
activityStorage[sessionCode] = {
32+
summary: null,
33+
logs: [],
34+
finalSummary: null
35+
};
36+
}
37+
38+
// Update based on data type
39+
if (activityData.type === 'summary') {
40+
activityStorage[sessionCode].summary = activityData.data;
41+
} else if (activityData.type === 'final') {
42+
activityStorage[sessionCode].finalSummary = activityData.data;
43+
} else if (activityData.type === 'log') {
44+
activityStorage[sessionCode].logs.push(activityData.data);
45+
// Keep only last 100 logs
46+
if (activityStorage[sessionCode].logs.length > 100) {
47+
activityStorage[sessionCode].logs.shift();
48+
}
49+
}
50+
51+
return res.status(200).json({
52+
success: true,
53+
message: 'Activity data saved',
54+
sessionCode
55+
});
56+
}
57+
58+
if (req.method === 'GET') {
59+
// Retrieve activity data
60+
const data = activityStorage[sessionCode];
61+
62+
if (!data) {
63+
return res.status(200).json({
64+
summary: null,
65+
finalSummary: null,
66+
logs: []
67+
});
68+
}
69+
70+
// Return the most recent summary (final takes precedence)
71+
return res.status(200).json({
72+
summary: data.finalSummary || data.summary,
73+
finalSummary: data.finalSummary,
74+
logs: data.logs
75+
});
76+
}
77+
78+
return res.status(405).json({ error: 'Method not allowed' });
79+
}

scripts/activity-monitor.js

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,12 @@
281281

282282
// 5. Log events to Firebase
283283
function logEvent(eventType, data) {
284-
if (!monitoring || !window.firebase) return;
284+
if (!monitoring) return;
285+
286+
if (!window.firebase || !window.firebase.database) {
287+
console.warn('Firebase not available for logging event:', eventType);
288+
return;
289+
}
285290

286291
try {
287292
const eventData = {
@@ -292,9 +297,16 @@
292297
timestamp: Date.now()
293298
};
294299

300+
console.log('Logging event to Firebase:', eventType, sessionCode);
295301
firebase.database()
296302
.ref(`sessions/${sessionCode}/activity_log`)
297-
.push(eventData);
303+
.push(eventData)
304+
.then(() => {
305+
console.log('✅ Event logged successfully:', eventType);
306+
})
307+
.catch(err => {
308+
console.error('❌ Firebase push failed:', err);
309+
});
298310
} catch (error) {
299311
console.error('Failed to log event:', error);
300312
}
@@ -346,10 +358,19 @@
346358
console.log('Activity Summary:', summary);
347359

348360
// Store summary
349-
if (window.firebase) {
361+
if (window.firebase && window.firebase.database) {
362+
console.log('📝 Saving activity summary to Firebase for session:', sessionCode);
350363
firebase.database()
351364
.ref(`sessions/${sessionCode}/activity_summary`)
352-
.set(summary);
365+
.set(summary)
366+
.then(() => {
367+
console.log('✅ Activity summary saved successfully');
368+
})
369+
.catch(err => {
370+
console.error('❌ Failed to save activity summary:', err);
371+
});
372+
} else {
373+
console.warn('Firebase not available for saving summary');
353374
}
354375

355376
// Update interviewer dashboard
@@ -413,12 +434,19 @@
413434
};
414435

415436
// Save to Firebase
416-
if (window.firebase && sessionCode) {
437+
if (window.firebase && window.firebase.database && sessionCode) {
438+
console.log('💾 Saving final activity summary for session:', sessionCode);
417439
firebase.database()
418440
.ref(`sessions/${sessionCode}/activity_final_summary`)
419-
.set(finalSummary);
420-
421-
console.log('Activity summary saved:', finalSummary);
441+
.set(finalSummary)
442+
.then(() => {
443+
console.log('✅ Final activity summary saved successfully:', finalSummary);
444+
})
445+
.catch(err => {
446+
console.error('❌ Failed to save final activity summary:', err);
447+
});
448+
} else {
449+
console.warn('Cannot save final summary - Firebase or sessionCode missing');
422450
}
423451

424452
return finalSummary;
@@ -523,4 +551,47 @@
523551
}
524552

525553
console.log('Activity Monitor module loaded - using reliable browser APIs');
554+
555+
// Debug function to test Firebase connectivity and manually save test data
556+
window.testActivitySave = function(testSessionCode) {
557+
const code = testSessionCode || sessionCode || 'test123';
558+
console.log('🧪 Testing activity save for session:', code);
559+
560+
if (!window.firebase || !window.firebase.database) {
561+
console.error('❌ Firebase not available');
562+
return;
563+
}
564+
565+
const testData = {
566+
tabSwitches: 5,
567+
idlePeriods: 2,
568+
totalIdleSeconds: 120,
569+
activityScore: 75,
570+
sessionDurationMinutes: 10,
571+
test: true,
572+
timestamp: Date.now()
573+
};
574+
575+
console.log('📝 Attempting to save test data:', testData);
576+
577+
firebase.database()
578+
.ref(`sessions/${code}/activity_test`)
579+
.set(testData)
580+
.then(() => {
581+
console.log('✅ Test data saved successfully!');
582+
console.log('Now trying to read it back...');
583+
return firebase.database()
584+
.ref(`sessions/${code}/activity_test`)
585+
.once('value');
586+
})
587+
.then(snapshot => {
588+
const retrieved = snapshot.val();
589+
console.log('✅ Successfully retrieved test data:', retrieved);
590+
console.log('Firebase is working correctly!');
591+
})
592+
.catch(err => {
593+
console.error('❌ Firebase error:', err);
594+
console.error('Error details:', err.message, err.code);
595+
});
596+
};
526597
})();

scripts/app.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,23 +1156,43 @@
11561156

11571157
// Display activity tab data
11581158
function displayActivityTab(sessionCode) {
1159+
console.log('displayActivityTab called for session:', sessionCode);
11591160
const container = document.getElementById('activity-tracking-data');
1160-
if (!container) return;
1161+
if (!container) {
1162+
console.error('Activity container not found');
1163+
return;
1164+
}
11611165

11621166
// Start loading
11631167
container.innerHTML = '<p class="loading-message">Loading activity data...</p>';
11641168

11651169
// Get activity data from Firebase
1166-
if (window.firebase) {
1170+
if (window.firebase && window.firebase.database) {
1171+
console.log('Fetching activity data from Firebase...');
1172+
console.log('Firebase available:', !!window.firebase);
1173+
console.log('Firebase database available:', !!window.firebase.database);
1174+
1175+
// Also check for any activity logs
1176+
firebase.database()
1177+
.ref(`sessions/${sessionCode}/activity_log`)
1178+
.limitToLast(5)
1179+
.once('value')
1180+
.then(snapshot => {
1181+
const logs = snapshot.val();
1182+
console.log('Activity logs found:', logs);
1183+
});
1184+
11671185
// Try to get final summary first, then regular summary
11681186
firebase.database()
11691187
.ref(`sessions/${sessionCode}/activity_final_summary`)
11701188
.once('value')
11711189
.then(snapshot => {
11721190
let activityData = snapshot.val();
1191+
console.log('Final summary data:', activityData);
11731192

11741193
// If no final summary, try regular summary
11751194
if (!activityData) {
1195+
console.log('No final summary, checking regular summary...');
11761196
return firebase.database()
11771197
.ref(`sessions/${sessionCode}/activity_summary`)
11781198
.once('value');
@@ -1181,6 +1201,7 @@
11811201
})
11821202
.then(snapshot => {
11831203
const activityData = snapshot.val();
1204+
console.log('Activity data retrieved:', activityData);
11841205

11851206
if (!activityData) {
11861207
container.innerHTML = `

0 commit comments

Comments
 (0)