Skip to content

perf: Memoize journey timeline stats calculation #252

@claude

Description

@claude

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').length

Impact

  • 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


🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementEnhancement on existing featureperformancePerformance improvements

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions