Fix stale task polling by keeping it always active alongside WebSocket

Polling was disabled when wsConnected was true, but if the WS connected
while workers hadn't been redeployed (no pub/sub messages flowing), the
UI received no updates at all. Polling now always runs at 5s as the
baseline. WebSocket provides faster real-time updates on top when
available — the two coexist, last writer wins.
This commit is contained in:
Viktor Barzin 2026-02-09 21:37:07 +00:00
parent f3cbeb3f5e
commit 8d52bdf99d
No known key found for this signature in database
GPG key ID: 0EB088298288D958
2 changed files with 5 additions and 6 deletions

View file

@ -134,11 +134,8 @@ export function TaskIndicator({
} }
}, [wsConnected, wsTasks, taskID]); }, [wsConnected, wsTasks, taskID]);
// ----- Polling fallback (only when WS is not connected) ----- // ----- Polling (always active as baseline; WS provides faster updates on top) -----
useEffect(() => { useEffect(() => {
// If WS is connected, skip polling
if (wsConnected) return;
if (!user || !taskID) { if (!user || !taskID) {
setTaskStatus(null); setTaskStatus(null);
setTaskResult(null); setTaskResult(null);
@ -153,6 +150,8 @@ export function TaskIndicator({
setTaskResult(null); setTaskResult(null);
const pollTaskStatus = async () => { const pollTaskStatus = async () => {
// Skip this poll cycle if cancelled locally
if (cancelledRef.current) return true;
try { try {
const data = await fetchTaskStatus(user, taskID); const data = await fetchTaskStatus(user, taskID);
const status = data.status as TaskStatus; const status = data.status as TaskStatus;
@ -214,7 +213,7 @@ export function TaskIndicator({
}, POLLING_INTERVALS.TASK_STATUS_MS); }, POLLING_INTERVALS.TASK_STATUS_MS);
return () => clearInterval(interval); return () => clearInterval(interval);
}, [taskID, user, wsConnected]); }, [taskID, user]);
const handleCancel = async () => { const handleCancel = async () => {
if (!user || !taskID || isCancelling) return; if (!user || !taskID || isCancelling) return;

View file

@ -59,7 +59,7 @@ export const DEFAULT_FORM_VALUES = {
// Polling intervals // Polling intervals
export const POLLING_INTERVALS = { export const POLLING_INTERVALS = {
TASK_STATUS_MS: 30000, // 30 seconds (fallback when WebSocket is unavailable) TASK_STATUS_MS: 5000, // 5 seconds
} as const; } as const;
// WebSocket paths // WebSocket paths