-
Notifications
You must be signed in to change notification settings - Fork 3
Open
Labels
enhancementEnhancement on existing featureEnhancement on existing featureperformancePerformance improvementsPerformance improvements
Description
Summary
The Journey screen filters the timeline events array 3 times during each render to calculate stats, which is inefficient for large event arrays.
Location
app/(app)/(tabs)/journey.tsx:402-431
Current Code
events.filter((e) => e.type === 'step_completion').length
events.filter((e) => e.type === 'task_completion').length
events.filter((e) => e.type === 'milestone' || e.type === 'task_milestone').lengthImpact
- Severity: Medium
- With 100+ timeline events, this creates unnecessary computation on every render
- Three separate O(n) iterations where one would suffice
Recommended Fix
Pre-calculate these stats in a memoized helper or compute them once in the useEffect where events are processed:
const stats = useMemo(() => {
let steps = 0, tasks = 0, milestones = 0;
for (const e of events) {
if (e.type === 'step_completion') steps++;
else if (e.type === 'task_completion') tasks++;
else if (e.type === 'milestone' || e.type === 'task_milestone') milestones++;
}
return { stepsCompleted: steps, tasksCompleted: tasks, milestonesReached: milestones };
}, [events]);Related
- Part of: 📋 Daily Codebase Review - 2026-01-05 #250 (Daily Codebase Review - 2026-01-05)
🤖 Generated with Claude Code
coderabbitai
Metadata
Metadata
Assignees
Labels
enhancementEnhancement on existing featureEnhancement on existing featureperformancePerformance improvementsPerformance improvements