feat: prevent concurrent query submissions in useGeminiStream hook

This commit is contained in:
tanzhenxin
2025-08-14 16:39:26 +08:00
parent 6516d0d136
commit c58106079e
2 changed files with 275 additions and 0 deletions

View File

@@ -97,6 +97,7 @@ export const useGeminiStream = (
const [initError, setInitError] = useState<string | null>(null);
const abortControllerRef = useRef<AbortController | null>(null);
const turnCancelledRef = useRef(false);
const isSubmittingQueryRef = useRef(false);
const [isResponding, setIsResponding] = useState<boolean>(false);
const [thought, setThought] = useState<ThoughtSummary | null>(null);
const [pendingHistoryItemRef, setPendingHistoryItem] =
@@ -622,6 +623,11 @@ export const useGeminiStream = (
options?: { isContinuation: boolean },
prompt_id?: string,
) => {
// Prevent concurrent executions of submitQuery
if (isSubmittingQueryRef.current) {
return;
}
if (
(streamingState === StreamingState.Responding ||
streamingState === StreamingState.WaitingForConfirmation) &&
@@ -629,6 +635,9 @@ export const useGeminiStream = (
)
return;
// Set the flag to indicate we're now executing
isSubmittingQueryRef.current = true;
const userMessageTimestamp = Date.now();
// Reset quota error flag when starting a new query (not a continuation)
@@ -653,6 +662,7 @@ export const useGeminiStream = (
);
if (!shouldProceed || queryToSend === null) {
isSubmittingQueryRef.current = false;
return;
}
@@ -677,6 +687,7 @@ export const useGeminiStream = (
);
if (processingStatus === StreamProcessingStatus.UserCancelled) {
isSubmittingQueryRef.current = false;
return;
}
@@ -708,6 +719,7 @@ export const useGeminiStream = (
}
} finally {
setIsResponding(false);
isSubmittingQueryRef.current = false;
}
},
[