Skip to content

Commit ef1ab90

Browse files
Archithclaude
andcommitted
Fix NaN values in Slack export activity metrics
- Handle different field names from Firebase (sessionDuration vs sessionDurationMinutes) - Convert totalIdleTime to totalIdleSeconds correctly - Convert sessionDuration from seconds to minutes for display - Fixed idle percentage calculation to avoid NaN - Handle suspiciousPatterns as both array and number Firebase stores: - sessionDuration (in seconds) not sessionDurationMinutes - totalIdleTime (in seconds) not totalIdleSeconds - suspiciousPatterns as number not array 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 21b932c commit ef1ab90

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

scripts/slack-integration.js

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,19 +178,25 @@
178178
const scoreEmoji = activitySummary.activityScore > 80 ? '✅' :
179179
activitySummary.activityScore > 60 ? '⚠️' : '🚨';
180180

181+
// Handle different field names from Firebase vs in-memory
182+
const totalIdleSeconds = activitySummary.totalIdleSeconds || activitySummary.totalIdleTime || 0;
183+
const sessionDurationSeconds = activitySummary.sessionDuration || (activitySummary.sessionDurationMinutes * 60) || 0;
184+
const sessionDurationMinutes = Math.round(sessionDurationSeconds / 60);
185+
181186
// Calculate idle percentage
182-
const idlePercentage = Math.round((activitySummary.totalIdleSeconds / (activitySummary.sessionDurationMinutes * 60)) * 100);
187+
const idlePercentage = sessionDurationSeconds > 0 ?
188+
Math.round((totalIdleSeconds / sessionDurationSeconds) * 100) : 0;
183189

184190
activitySection = `
185191
<div style="margin-top: 10px; padding: 8px; background: rgba(66,165,245,0.1); border-radius: 4px;">
186192
<strong>📊 Candidate Behavior Analysis:</strong>
187193
<div>Engagement Level: ${scoreEmoji} ${engagementLevel} (Score: ${activitySummary.activityScore}/100)</div>
188194
<div>• Tab Switches: ${activitySummary.tabSwitches} ${activitySummary.tabSwitches > 10 ? '⚠️ (High)' : ''}</div>
189195
<div>• Idle Periods: ${activitySummary.idlePeriods} times</div>
190-
<div>• Total Idle Time: ${Math.round(activitySummary.totalIdleSeconds / 60)} min (${idlePercentage}% of session)</div>
191-
${activitySummary.suspiciousPatterns && activitySummary.suspiciousPatterns.length > 0 ?
192-
`<div>• Notable Behaviors: ${activitySummary.suspiciousPatterns.length} detected</div>` : ''}
193-
<div>• Session Duration: ${activitySummary.sessionDurationMinutes} minutes</div>
196+
<div>• Total Idle Time: ${Math.round(totalIdleSeconds / 60)} min (${idlePercentage}% of session)</div>
197+
${activitySummary.suspiciousPatterns && activitySummary.suspiciousPatterns > 0 ?
198+
`<div>• Notable Behaviors: ${activitySummary.suspiciousPatterns} detected</div>` : ''}
199+
<div>• Session Duration: ${sessionDurationMinutes} minutes</div>
194200
</div>
195201
`;
196202
}
@@ -255,8 +261,14 @@
255261
const activityColor = activitySummary.activityScore > 80 ? '#4caf50' :
256262
activitySummary.activityScore > 60 ? '#ff9800' : '#ff0000';
257263

264+
// Handle different field names from Firebase vs in-memory
265+
const totalIdleSeconds = activitySummary.totalIdleSeconds || activitySummary.totalIdleTime || 0;
266+
const sessionDurationSeconds = activitySummary.sessionDuration || (activitySummary.sessionDurationMinutes * 60) || 0;
267+
const sessionDurationMinutes = Math.round(sessionDurationSeconds / 60);
268+
258269
// Calculate idle percentage
259-
const idlePercentage = Math.round((activitySummary.totalIdleSeconds / (activitySummary.sessionDurationMinutes * 60)) * 100);
270+
const idlePercentage = sessionDurationSeconds > 0 ?
271+
Math.round((totalIdleSeconds / sessionDurationSeconds) * 100) : 0;
260272

261273
// Determine engagement emoji and text
262274
let engagementEmoji = '✅';
@@ -269,6 +281,11 @@
269281
engagementText = 'Medium Engagement';
270282
}
271283

284+
// Handle suspicious patterns - could be array or number
285+
const suspiciousCount = Array.isArray(activitySummary.suspiciousPatterns) ?
286+
activitySummary.suspiciousPatterns.length :
287+
(activitySummary.suspiciousPatterns || 0);
288+
272289
slackPayload.attachments.push({
273290
color: activityColor,
274291
title: "📊 Candidate Behavior Metrics",
@@ -290,7 +307,7 @@
290307
},
291308
{
292309
title: "Idle Time",
293-
value: `${Math.round(activitySummary.totalIdleSeconds / 60)}min (${idlePercentage}%)`,
310+
value: `${Math.round(totalIdleSeconds / 60)}min (${idlePercentage}%)`,
294311
short: true
295312
},
296313
{
@@ -300,12 +317,12 @@
300317
},
301318
{
302319
title: "Session Duration",
303-
value: `${activitySummary.sessionDurationMinutes} min`,
320+
value: `${sessionDurationMinutes} min`,
304321
short: true
305322
}
306323
],
307-
footer: activitySummary.suspiciousPatterns && activitySummary.suspiciousPatterns.length > 0 ?
308-
`⚠️ ${activitySummary.suspiciousPatterns.length} notable behaviors detected` :
324+
footer: suspiciousCount > 0 ?
325+
`⚠️ ${suspiciousCount} notable behaviors detected` :
309326
"✅ Normal activity patterns"
310327
});
311328
}

0 commit comments

Comments
 (0)