From 0f302521e4a7dcd1c7603446a428898089ed7bd8 Mon Sep 17 00:00:00 2001 From: iliya Date: Sat, 28 Feb 2026 22:25:04 +0200 Subject: [PATCH] fix: improve team selection logic and prevent duplicate fetches - Enhanced GlobalTaskDetailDialog to handle loading states more effectively, preventing unnecessary re-fetching of team data. - Updated selectTeam function in teamSlice to guard against duplicate in-flight fetches for the same team, improving performance and user experience. - Refactored dependencies in useEffect to ensure proper data loading behavior. --- .../team/dialogs/GlobalTaskDetailDialog.tsx | 20 +++++++++++++++++-- src/renderer/store/slices/teamSlice.ts | 6 ++++++ 2 files changed, 24 insertions(+), 2 deletions(-) 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({