diff --git a/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx b/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx index efc1c1a9..21b9ac9e 100644 --- a/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +++ b/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx @@ -44,9 +44,25 @@ export const GlobalTaskDetailDialog = (): React.JSX.Element | null => { // Load full team data in the background to enable "as before" details (logs/changes/members). useEffect(() => { if (!globalTaskDetail) return; - if (selectedTeamName === teamName && selectedTeamData) return; + if (!teamName) return; + + // Avoid re-triggering selectTeam in a loop while the fetch is in flight. + // selectedTeamName is set immediately by selectTeam(), but selectedTeamData + // remains null until IPC resolves. + if (selectedTeamName === teamName) { + if (selectedTeamData || selectedTeamLoading) return; + // Retry once if we are on the right team but have no data and not loading (e.g. prior error). + } + void selectTeam(teamName, { skipProjectAutoSelect: true }); - }, [globalTaskDetail, selectTeam, selectedTeamData, selectedTeamName, teamName]); + }, [ + globalTaskDetail, + selectTeam, + selectedTeamData, + selectedTeamLoading, + selectedTeamName, + teamName, + ]); const isFullTeamLoaded = selectedTeamName === teamName && !!selectedTeamData; diff --git a/src/renderer/store/slices/teamSlice.ts b/src/renderer/store/slices/teamSlice.ts index 29712ca4..e320e6f3 100644 --- a/src/renderer/store/slices/teamSlice.ts +++ b/src/renderer/store/slices/teamSlice.ts @@ -354,6 +354,12 @@ export const createTeamSlice: StateCreator = (set, }, selectTeam: async (teamName: string, opts) => { + // Guard: prevent duplicate in-flight fetches for the same team. + // GlobalTaskDetailDialog + tab navigation can call selectTeam() in quick succession. + if (get().selectedTeamLoading && get().selectedTeamName === teamName) { + return; + } + // Clear stale data immediately to prevent flash of previous team's content const prev = get().selectedTeamName; set({