@@ -43,6 +43,7 @@ import {
4343 selectCurrentGroupingV3 ,
4444 fetchTasksV3 ,
4545 addSubtaskToParent ,
46+ removeTemporarySubtask ,
4647} from '@/features/task-management/task-management.slice' ;
4748import {
4849 updateEnhancedKanbanSubtask ,
@@ -153,13 +154,19 @@ export const useTaskSocketHandlers = () => {
153154 const updatedTask : Task = {
154155 ...currentTask ,
155156 labels :
156- labels . all_labels ?. map ( l => ( {
157+ labels . labels ?. map ( l => ( {
157158 id : l . id || '' ,
158159 name : l . name || '' ,
159160 color : l . color_code || '#1890ff' ,
160161 end : l . end ,
161162 names : l . names ,
162163 } ) ) || [ ] ,
164+ all_labels :
165+ labels . all_labels ?. map ( l => ( {
166+ id : l . id || '' ,
167+ name : l . name || '' ,
168+ color_code : l . color_code || '#1890ff' ,
169+ } ) ) || [ ] ,
163170 updatedAt : new Date ( ) . toISOString ( ) ,
164171 updated_at : new Date ( ) . toISOString ( ) ,
165172 } ;
@@ -675,6 +682,24 @@ export const useTaskSocketHandlers = () => {
675682 parent_task_id : data . parent_task_id ,
676683 is_sub_task : true ,
677684 } ;
685+
686+ // Before adding the real subtask, remove any temporary subtasks with the same name
687+ // This prevents duplication from optimistic updates
688+ const parentTask = store . getState ( ) . taskManagement . entities [ data . parent_task_id ] ;
689+ if ( parentTask && parentTask . sub_tasks ) {
690+ const temporarySubtasks = parentTask . sub_tasks . filter (
691+ ( st : Task ) => st . isTemporary && st . name === subtask . title
692+ ) ;
693+
694+ // Remove each temporary subtask
695+ temporarySubtasks . forEach ( ( tempSubtask : Task ) => {
696+ dispatch ( removeTemporarySubtask ( {
697+ parentTaskId : data . parent_task_id ,
698+ tempId : tempSubtask . id
699+ } ) ) ;
700+ } ) ;
701+ }
702+
678703 dispatch ( addSubtaskToParent ( { parentId : data . parent_task_id , subtask } ) ) ;
679704
680705 // Also update enhanced kanban slice for subtask creation
0 commit comments