Skip to content

Commit ce882d9

Browse files
committed
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
1 parent ef65a6a commit ce882d9

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

frontend/src/features/tasks/components/TeamSelector.tsx

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,37 +41,62 @@ export default function TeamSelector({
4141
useEffect(() => {
4242
console.log('[TeamSelector] Effect triggered', {
4343
hasSelectedTaskDetail: !!selectedTaskDetail,
44+
taskDetailTeamId: selectedTaskDetail?.team?.id || 'null',
45+
taskDetailTeamName: selectedTaskDetail?.team?.name || 'null',
4446
selectedTeam: selectedTeam?.name || 'null',
4547
selectedTeamId: selectedTeam?.id || 'null',
4648
teamsLength: teams.length,
4749
});
4850

51+
// Wait for teams to load before syncing
52+
if (teams.length === 0) {
53+
console.log('[TeamSelector] Teams not loaded yet, skipping sync');
54+
return;
55+
}
56+
4957
// Priority 1: Set team from task detail if viewing a task
50-
if (
51-
selectedTaskDetail &&
52-
'team' in selectedTaskDetail &&
53-
selectedTaskDetail.team &&
54-
teams.length > 0
55-
) {
56-
const foundTeam =
57-
teams.find(t => t.id === (selectedTaskDetail.team as { id: number }).id) || null;
58-
if (foundTeam && (!selectedTeam || selectedTeam.id !== foundTeam.id)) {
59-
console.log('[TeamSelector] Setting team from task detail:', foundTeam.name, foundTeam.id);
60-
setSelectedTeam(foundTeam);
58+
if (selectedTaskDetail && 'team' in selectedTaskDetail) {
59+
const taskTeam = selectedTaskDetail.team;
60+
61+
// Case 1: Task has a valid team
62+
if (taskTeam && typeof taskTeam === 'object' && 'id' in taskTeam) {
63+
const taskTeamId = (taskTeam as { id: number }).id;
64+
const foundTeam = teams.find(t => t.id === taskTeamId) || null;
65+
66+
if (foundTeam) {
67+
// Only update if team changed to avoid unnecessary re-renders
68+
if (!selectedTeam || selectedTeam.id !== foundTeam.id) {
69+
console.log('[TeamSelector] Setting team from task detail:', foundTeam.name, foundTeam.id);
70+
setSelectedTeam(foundTeam);
71+
}
72+
return; // Team synced successfully, exit early
73+
} else {
74+
// Team exists in task detail but not in user's team list (deleted or no access)
75+
console.log('[TeamSelector] Task team not found in user teams, keeping current selection');
76+
// Keep current selectedTeam unchanged - don't clear it
77+
return;
78+
}
79+
}
80+
81+
// Case 2: Task has no team (team was deleted or never set)
82+
if (taskTeam === null) {
83+
console.log('[TeamSelector] Task has no team, clearing team selection');
84+
if (selectedTeam !== null) {
85+
setSelectedTeam(null);
86+
}
6187
return;
6288
}
6389
}
6490

65-
// Priority 2: Validate selected team still exists in list
66-
if (selectedTeam && teams.length > 0) {
91+
// Priority 2: Validate selected team still exists in list (only when not viewing a task detail)
92+
if (!selectedTaskDetail && selectedTeam && teams.length > 0) {
6793
const exists = teams.some(team => team.id === selectedTeam.id);
6894
if (!exists) {
6995
console.log('[TeamSelector] Selected team not in list, clearing selection');
7096
setSelectedTeam(null);
7197
}
7298
}
73-
// eslint-disable-next-line react-hooks/exhaustive-deps
74-
}, [selectedTaskDetail, teams]);
99+
}, [selectedTaskDetail, teams, selectedTeam, setSelectedTeam]);
75100

76101
const handleChange = (value: string) => {
77102
const team = teams.find(t => t.id === Number(value));

0 commit comments

Comments
 (0)