From ce882d9dc1f8b11fd95e5342cd61ab73ce4c979f Mon Sep 17 00:00:00 2001 From: qdaxb <4157870+qdaxb@users.noreply.github.com> Date: Thu, 27 Nov 2025 16:05:31 +0800 Subject: [PATCH 1/2] fix(frontend): improve TeamSelector synchronization with task detail - Add comprehensive logging for task team changes and selection state - Wait for teams list to load before attempting synchronization - Handle three distinct cases: 1. Task has valid team: sync if found in user's teams, otherwise keep current selection 2. Task has no team (null): clear team selection 3. No task detail: validate current selection exists in teams list - Add proper dependency array to useEffect (include selectedTeam and setSelectedTeam) - Prevent unnecessary re-renders by checking if team actually changed - Only validate selected team against teams list when not viewing a task detail - Improve edge case handling for deleted teams and access restrictions --- .../tasks/components/TeamSelector.tsx | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/frontend/src/features/tasks/components/TeamSelector.tsx b/frontend/src/features/tasks/components/TeamSelector.tsx index 33cb03e6..3b037b97 100644 --- a/frontend/src/features/tasks/components/TeamSelector.tsx +++ b/frontend/src/features/tasks/components/TeamSelector.tsx @@ -41,37 +41,62 @@ export default function TeamSelector({ useEffect(() => { console.log('[TeamSelector] Effect triggered', { hasSelectedTaskDetail: !!selectedTaskDetail, + taskDetailTeamId: selectedTaskDetail?.team?.id || 'null', + taskDetailTeamName: selectedTaskDetail?.team?.name || 'null', selectedTeam: selectedTeam?.name || 'null', selectedTeamId: selectedTeam?.id || 'null', teamsLength: teams.length, }); + // Wait for teams to load before syncing + if (teams.length === 0) { + console.log('[TeamSelector] Teams not loaded yet, skipping sync'); + return; + } + // Priority 1: Set team from task detail if viewing a task - if ( - selectedTaskDetail && - 'team' in selectedTaskDetail && - selectedTaskDetail.team && - teams.length > 0 - ) { - const foundTeam = - teams.find(t => t.id === (selectedTaskDetail.team as { id: number }).id) || null; - if (foundTeam && (!selectedTeam || selectedTeam.id !== foundTeam.id)) { - console.log('[TeamSelector] Setting team from task detail:', foundTeam.name, foundTeam.id); - setSelectedTeam(foundTeam); + if (selectedTaskDetail && 'team' in selectedTaskDetail) { + const taskTeam = selectedTaskDetail.team; + + // Case 1: Task has a valid team + if (taskTeam && typeof taskTeam === 'object' && 'id' in taskTeam) { + const taskTeamId = (taskTeam as { id: number }).id; + const foundTeam = teams.find(t => t.id === taskTeamId) || null; + + if (foundTeam) { + // Only update if team changed to avoid unnecessary re-renders + if (!selectedTeam || selectedTeam.id !== foundTeam.id) { + console.log('[TeamSelector] Setting team from task detail:', foundTeam.name, foundTeam.id); + setSelectedTeam(foundTeam); + } + return; // Team synced successfully, exit early + } else { + // Team exists in task detail but not in user's team list (deleted or no access) + console.log('[TeamSelector] Task team not found in user teams, keeping current selection'); + // Keep current selectedTeam unchanged - don't clear it + return; + } + } + + // Case 2: Task has no team (team was deleted or never set) + if (taskTeam === null) { + console.log('[TeamSelector] Task has no team, clearing team selection'); + if (selectedTeam !== null) { + setSelectedTeam(null); + } return; } } - // Priority 2: Validate selected team still exists in list - if (selectedTeam && teams.length > 0) { + // Priority 2: Validate selected team still exists in list (only when not viewing a task detail) + if (!selectedTaskDetail && selectedTeam && teams.length > 0) { const exists = teams.some(team => team.id === selectedTeam.id); if (!exists) { console.log('[TeamSelector] Selected team not in list, clearing selection'); setSelectedTeam(null); } } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedTaskDetail, teams]); + }, [selectedTaskDetail, teams, selectedTeam, setSelectedTeam]); const handleChange = (value: string) => { const team = teams.find(t => t.id === Number(value)); From 25a892026e36044e50f6c72efc40970867d3c9ee Mon Sep 17 00:00:00 2001 From: axb Date: Sat, 29 Nov 2025 21:24:07 +0800 Subject: [PATCH 2/2] Update frontend/src/features/tasks/components/TeamSelector.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- frontend/src/features/tasks/components/TeamSelector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/features/tasks/components/TeamSelector.tsx b/frontend/src/features/tasks/components/TeamSelector.tsx index 1b03f2c9..806d9e3d 100644 --- a/frontend/src/features/tasks/components/TeamSelector.tsx +++ b/frontend/src/features/tasks/components/TeamSelector.tsx @@ -96,7 +96,7 @@ export default function TeamSelector({ setSelectedTeam(null); } } - }, [selectedTaskDetail, teams, selectedTeam, setSelectedTeam]); + }, [selectedTaskDetail, teams]); const handleChange = (value: string) => { const team = teams.find(t => t.id === Number(value));