perf(renderer): skip unchanged project task groups

This commit is contained in:
777genius 2026-05-31 02:36:13 +03:00
parent fd3137237d
commit b6139d8558

View file

@ -401,6 +401,15 @@ const TaskRows = memo(function TaskRows({
); );
}); });
function areTaskReferencesEqual(prev: readonly GlobalTask[], next: readonly GlobalTask[]): boolean {
if (prev === next) return true;
if (prev.length !== next.length) return false;
for (let i = 0; i < prev.length; i += 1) {
if (prev[i] !== next[i]) return false;
}
return true;
}
interface ProjectTaskGroupProps { interface ProjectTaskGroupProps {
group: ProjectTaskGroupData; group: ProjectTaskGroupData;
isCollapsed: boolean; isCollapsed: boolean;
@ -427,7 +436,8 @@ interface ProjectTaskGroupProps {
getOwnerColorName: TaskOwnerColorResolver; getOwnerColorName: TaskOwnerColorResolver;
} }
const ProjectTaskGroup = memo(function ProjectTaskGroup({ const ProjectTaskGroup = memo(
function ProjectTaskGroup({
group, group,
isCollapsed, isCollapsed,
visibleCount, visibleCount,
@ -551,7 +561,34 @@ const ProjectTaskGroup = memo(function ProjectTaskGroup({
)} )}
</div> </div>
); );
}); },
(prev, next) =>
prev.group.projectKey === next.group.projectKey &&
prev.group.projectLabel === next.group.projectLabel &&
areTaskReferencesEqual(prev.group.tasks, next.group.tasks) &&
prev.isCollapsed === next.isCollapsed &&
prev.visibleCount === next.visibleCount &&
prev.noProjectGroupColor === next.noProjectGroupColor &&
prev.showMoreLabel === next.showMoreLabel &&
prev.showLessLabel === next.showLessLabel &&
prev.isPinned === next.isPinned &&
prev.isArchived === next.isArchived &&
prev.isNewTask === next.isNewTask &&
prev.isTeamOffline === next.isTeamOffline &&
prev.renamingKey === next.renamingKey &&
prev.formatTeamHeader === next.formatTeamHeader &&
prev.onToggleGroup === next.onToggleGroup &&
prev.onVisibleCountChange === next.onVisibleCountChange &&
prev.onTogglePin === next.onTogglePin &&
prev.onToggleArchive === next.onToggleArchive &&
prev.onMarkUnread === next.onMarkUnread &&
prev.onRename === next.onRename &&
prev.onDelete === next.onDelete &&
prev.onRenameComplete === next.onRenameComplete &&
prev.onRenameCancel === next.onRenameCancel &&
prev.getDisplaySubject === next.getDisplaySubject &&
prev.getOwnerColorName === next.getOwnerColorName
);
export const GlobalTaskList = memo(function GlobalTaskList({ export const GlobalTaskList = memo(function GlobalTaskList({
hideHeader = false, hideHeader = false,