Skip to content

Commit 42e2dc0

Browse files
vscarpenterclaude
andauthored
fix: update TaskCard memoization to track dependency changes (#20)
The memo comparator previously only checked allTasks.length, which missed updates when blocking tasks were completed or renamed. This caused dependency badges to show stale information until an unrelated change forced a re-render. Added dependency-aware comparison logic that: - Identifies all tasks affecting this card's dependency badges - Detects completion status changes in blocking/blocked tasks - Detects title changes (for accurate tooltips) - Maintains performance by only checking relevant tasks Fixes dependency badges not updating in real-time when related tasks change. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com>
1 parent a9bec11 commit 42e2dc0

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

components/task-card.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,37 @@ function TaskCardComponent({ task, allTasks, onEdit, onDelete, onToggleComplete,
209209
// Memoize the component to prevent unnecessary re-renders
210210
export const TaskCard = memo(TaskCardComponent, (prevProps, nextProps) => {
211211
// Custom comparison function for better performance
212+
213+
// Check if dependency-related tasks changed (for accurate badge rendering)
214+
// Get all tasks that might affect this card's dependency badges
215+
const prevDependencyIds = new Set([
216+
...prevProps.task.dependencies, // Tasks this task depends on
217+
...prevProps.allTasks.filter(t => t.dependencies.includes(prevProps.task.id)).map(t => t.id) // Tasks that depend on this task
218+
]);
219+
const nextDependencyIds = new Set([
220+
...nextProps.task.dependencies,
221+
...nextProps.allTasks.filter(t => t.dependencies.includes(nextProps.task.id)).map(t => t.id)
222+
]);
223+
224+
// If the set of related tasks changed, re-render
225+
if (prevDependencyIds.size !== nextDependencyIds.size) {
226+
return false;
227+
}
228+
229+
// Check if any dependency-related task's completion status or title changed
230+
for (const depId of prevDependencyIds) {
231+
const prevDepTask = prevProps.allTasks.find(t => t.id === depId);
232+
const nextDepTask = nextProps.allTasks.find(t => t.id === depId);
233+
234+
if (!prevDepTask || !nextDepTask) {
235+
return false; // Task was added or removed
236+
}
237+
238+
if (prevDepTask.completed !== nextDepTask.completed || prevDepTask.title !== nextDepTask.title) {
239+
return false; // Completion status or title changed
240+
}
241+
}
242+
212243
return (
213244
prevProps.task.id === nextProps.task.id &&
214245
prevProps.task.title === nextProps.task.title &&

0 commit comments

Comments
 (0)