refactor(tasks-controller): enhance getTasksV3 method for performance and clarity

- Improved logging for performance tracking in the getTasksV3 method.
- Streamlined progress refresh logic and removed unnecessary calculations to optimize initial load times.
- Unified query handling by aligning with the getList method for consistency.
- Transformed response structure to maintain compatibility with V3 format while ensuring efficient data processing.
- Added memoized selectors in the frontend for better performance and reduced re-renders.
This commit is contained in:
chamikaJ
2025-07-07 14:30:19 +05:30
parent 9ec422c6e2
commit 8533a440bc
3 changed files with 101 additions and 157 deletions

View File

@@ -109,7 +109,14 @@ export const selectCurrentGrouping = (state: RootState) => state.grouping.curren
export const selectCustomPhases = (state: RootState) => state.grouping.customPhases;
export const selectGroupOrder = (state: RootState) => state.grouping.groupOrder;
export const selectGroupStates = (state: RootState) => state.grouping.groupStates;
export const selectCollapsedGroups = (state: RootState) => new Set(state.grouping.collapsedGroups);
export const selectCollapsedGroupsArray = (state: RootState) => state.grouping.collapsedGroups;
// Memoized selector to prevent unnecessary re-renders
export const selectCollapsedGroups = createSelector(
[selectCollapsedGroupsArray],
(collapsedGroupsArray) => new Set(collapsedGroupsArray)
);
export const selectIsGroupCollapsed = (state: RootState, groupId: string) =>
state.grouping.collapsedGroups.includes(groupId);

View File

@@ -5,6 +5,7 @@ import {
createAsyncThunk,
EntityState,
EntityId,
createSelector,
} from '@reduxjs/toolkit';
import { Task, TaskManagementState, TaskGroup, TaskGrouping } from '@/types/task-management.types';
import { ITaskListColumn } from '@/types/tasks/taskList.types';
@@ -1142,7 +1143,12 @@ export const {
// Export the selectors
export const selectAllTasks = (state: RootState) => state.taskManagement.entities;
export const selectAllTasksArray = (state: RootState) => Object.values(state.taskManagement.entities);
// Memoized selector to prevent unnecessary re-renders
export const selectAllTasksArray = createSelector(
[selectAllTasks],
(entities) => Object.values(entities)
);
export const selectTaskById = (state: RootState, taskId: string) => state.taskManagement.entities[taskId];
export const selectTaskIds = (state: RootState) => state.taskManagement.ids;
export const selectGroups = (state: RootState) => state.taskManagement.groups;
@@ -1153,15 +1159,21 @@ export const selectSelectedPriorities = (state: RootState) => state.taskManageme
export const selectSearch = (state: RootState) => state.taskManagement.search;
export const selectSubtaskLoading = (state: RootState, taskId: string) => state.taskManagement.loadingSubtasks[taskId] || false;
// Memoized selectors
export const selectTasksByStatus = (state: RootState, status: string) =>
Object.values(state.taskManagement.entities).filter(task => task.status === status);
// Memoized selectors to prevent unnecessary re-renders
export const selectTasksByStatus = createSelector(
[selectAllTasksArray, (_state: RootState, status: string) => status],
(tasks, status) => tasks.filter(task => task.status === status)
);
export const selectTasksByPriority = (state: RootState, priority: string) =>
Object.values(state.taskManagement.entities).filter(task => task.priority === priority);
export const selectTasksByPriority = createSelector(
[selectAllTasksArray, (_state: RootState, priority: string) => priority],
(tasks, priority) => tasks.filter(task => task.priority === priority)
);
export const selectTasksByPhase = (state: RootState, phase: string) =>
Object.values(state.taskManagement.entities).filter(task => task.phase === phase);
export const selectTasksByPhase = createSelector(
[selectAllTasksArray, (_state: RootState, phase: string) => phase],
(tasks, phase) => tasks.filter(task => task.phase === phase)
);
// Add archived selector
export const selectArchived = (state: RootState) => state.taskManagement.archived;